在子类类中重载基类赋值操作符会导致二义性赋值错误
Overloading baseclass assignment operator in subclass class leads to ambiguous assignment error
我有这个基类(细节删除)
template<class T>
class GPtr
{
public:
typedef T BaseType;
GPtr& operator=(const BaseType& rhs)
{
m_p = rhs.get();
return *this;
}
private:
BaseType m_p;
};
然后子类专门化模板并添加另一个赋值选项:
class GDrawablePtr : public GPtr<XYZ>
{
public:
GDrawablePtr& operator=(const RootType& rhs)
{
GPtr::operator =(convert<BaseType::element_type>(rhs));
return *this;
}
/* -- only compiles if this is uncommented
GDrawablePtr& operator=(const BaseType& rhs)
{
GPtr::operator =(rhs);
return *this;
}
*/
};
在注释掉该代码后,我在赋值实例时得到关于歧义赋值的编译错误。如果我取消注释,那么即使它看起来没有做任何新的事情,编译也是成功的。
是否有一种方法可以避免重新定义原始的基赋值操作符,这种行为的原因是什么?
这就是所谓的隐藏:在派生类中声明函数使得基类中同名的任何函数都无法访问。您可以使用using-declaration来使基类版本也可用:
// In GDrawablePtr
using GPtr::operator=;
相关文章:
- 为"adjacent"变量赋值时出现问题
- C++中的赋值发生,尽管右侧出现异常
- 用C++中的sscanf赋值
- 为std::string的某个索引赋值
- 重载Singly Linked List中的赋值运算符
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- gtest_使用setargpointee在函数中赋值
- 非常量变量只读位置的赋值
- 使用赋值运算符重载从类中返回jobject
- C++数据文件、数组和计算赋值
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 全局作用域中函数指针的赋值
- 错误:在为指针赋值时,void值没有被忽略
- 标准库类型的赋值运算符的引用限定符
- 关于 c++ 函数中指针赋值的简单问题
- 复制构造函数、赋值运算符C++
- 标准::变体的赋值运算符
- cin >> int 给定一个字符串将 int 赋值为 0
- if 子句中的赋值不起作用
- 在子类类中重载基类赋值操作符会导致二义性赋值错误