【发布时间】:2010-12-10 01:30:40
【问题描述】:
我对嵌套模板和赋值运算符的覆盖有疑问。 假设我想要一个引用计数类模板_reference。这个 _reference 现在很简单 持有指向引用计数对象的指针。现在的问题是这一切都很好, 只要我用简单的类或结构来做这件事。例如。 _reference ...,
但是现在我想创建一个类模板,它是对转发它所拥有的类的标准向量的引用。
不,我只是发布代码:(它现在不进行引用计数和那些东西,它只是提取我遇到的问题)
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)
GCC 错误:
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>)))'
所以请谁能解释一下为什么赋值运算符在这里不起作用,而 simpleSetIt - 函数可以?
【问题讨论】:
-
不要使用像
_reference这样的类名。在命名空间范围内以下划线开头的名称保留用于实现。您冒着名称冲突的风险。
标签: c++ templates nested assignment-operator