首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套模板中的operator= (T *r)

嵌套模板中的operator= (T *r)
EN

Stack Overflow用户
提问于 2009-10-26 08:01:35
回答 2查看 265关注 0票数 2

我有一个关于嵌套模板和赋值操作符重写的问题。假设我想要一个refcounting类模板_reference。这个_reference现在只保存一个指向ref计数对象的指针。现在的问题是,只要我用简单的类或结构来完成这个任务,这一切都能正常工作。例如:_reference……

但是现在我想做一个类模板,它是对一个std向量的引用,转发它所包含的类。

不,我只是张贴代码:(它不做重新计算和那些东西现在,这只是我的问题的提取)

代码语言:javascript
复制
template <typename T>
class _reference
{
private:
    T* p_;

public:

// !!! this assignment seems only to work, when T is no class template already...
void operator= (T* r)                   
{
    p_ = r;
}

// WHILE this ALWAYS works as well...
void simplySetIt (T* r)                 
{
    p_ = r;
}
};

template <typename T>
class _ref_vector : public _reference<vector<T> >
{
};

void test2 ()
{
_reference<vector<long> > ref_ptr2;
_ref_vector<long>         ref_ptr3;

ref_ptr2 = new vector<long>;                    // works fine.

ref_ptr3 = new vector<long>;                // BUT: THIS doesnt work
    ref_ptr3.simplySetIt (new vector<long>);    // WHILE: this works fine...
}

MSVC-错误:

代码语言:javascript
复制
error C2679: binary '=' : no operator found which takes a right-hand operand of type 
'std::vector<_Ty> *' (or there is no acceptable conversion)

GCC-错误:

代码语言:javascript
复制
error: no match for 'operator=' in 'ptr3 = (((const stlp_std::allocator<long int>&)
((const stlp_std::allocator<long int>*)(& stlp_std::allocator<long int>()))), 
(((stlp_std::vector<long int, stlp_std::allocator<long int> >*)operator new(12u)), 
((<anonymous> != 0u) ? (<anonymous>->stlp_std::vector<_Tp, _Alloc>::vector [with 
_Tp = long int, _Alloc = stlp_std::allocator<long int>]
(<anonymous>), <anonymous>) : <anonymous>)))'

所以,请有人解释一下为什么赋值操作符在这里不工作,而simplySetIt -函数在这里工作吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-26 08:15:17

基operator=由隐式赋值运算符隐藏,因此不再参与重载。您需要将_ref_vector写成

代码语言:javascript
复制
template <typename T>
class _ref_vector : public _reference<vector<T> >
{
  using _reference<vector<T> >::operator=;
};

由于没有编译器添加版本的simplySetIt,查找将在基类中找到它。

票数 6
EN

Stack Overflow用户

发布于 2009-10-26 08:45:25

如标准所述(13.5.3):

由于如果用户未声明副本赋值操作符operator=,则为该类隐式声明一个副本赋值操作符,因此派生类的复制赋值操作符总是隐藏基类赋值运算符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1623575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档