嵌套模板中的运算符= (T *r)
我有一个关于嵌套模板和赋值运算符重写的问题。 假设我想要一个引用计数类模板 _reference。这个_reference 现在简单 保存指向引用计数对象的指针。现在的问题是这一切都运行良好, 只要我用简单的类或结构来做到这一点。例如。 _reference ...,
但现在我想制作一个类模板,它是对转发其所持有的类的 std-vector 的引用。
不,我只是发布代码:(它现在不进行引用计数之类的事情,它只是提取我遇到的问题)
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:
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:
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 - 函数却起作用?
I have a problem concerning nested templates and the overriding of the assignment operator.
Say i want to have a refcounting class template _reference. This _reference for now simply
holds a pointer to the ref-counted object. The problem now is that this all works fine,
as long as im doing this with simple classes or structs. eg. _reference ...,
But now i want to make a class template that is a reference to a std-vector forwarding the class it holds.
Nah, i just post the code: (it doesnt do refcounting and that stuff right now, its just the extraction of the problem i have)
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:
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:
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>)))'
So please can anybody explain me why the assignment operator doesnt work here, while the simplySetIt - function does ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
基本运算符= 被隐式赋值运算符隐藏,因此它不再参与重载。您需要将
_ref_vector
编写为由于 simpleSetIt 没有编译器添加的版本,因此查找将在基类中找到它。
The base operator= gets hidden by implicit assignment operators, so that it doesn't take part in the overloading anymore. You need to write
_ref_vector
asAs there is no compiler-added version of simplySetIt, lookup will find it in the base class.
正如标准所说(13.5.3):
因为复制赋值运算符operator=是隐式声明的
如果用户未声明一个类 (12.8),则为基类赋值
运算符始终被复制赋值运算符隐藏
派生类。
As the standard says (13.5.3):
Because a copy assignment operator operator= is implicitly declared for
a class if not declared by the user (12.8), a base class assignment
operator is always hidden by the copy assignment operator of the
derived class.