我有一个问题关于嵌套的模板和压倒一切的转让操作。说我想有一个类引用计数的模板_reference.这_reference现在只需 拥有一个指ref计数的对象。现在的问题是,这一切正常工作, 只要im这样做简单的类或结构。例如。_reference...,

但现在我想做一类的模板,这是一个参考std-矢量转发这类保留。

不,我只是后代码:(it doesn't do引用计数和这些东西,现在,它只是提取我的问题)

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-错误:

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

海湾合作委员会-的错误:

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功能呢?

有帮助吗?

解决方案

基员=被隐藏的通过隐含的分配运营商,因此,它不参加在超载了你需要写 _ref_vector 作为

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

因为没有编译器加入版本的simplySetIt,查找会找到它的基类。

其他提示

作为该标准说:(13.5.3):

因为一个复制分配运营商操作员=是隐含地宣布 类如果不宣布的用户(12.8)、基类分配 操作者总是隐藏的复制分配运营商 源类。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top