2016-04-17 50 views
3

我一直在问自己是否有可能创建一个基类,该基类有子类可以使用的操作符重载。子级可以使用父级的asignment操作符重载吗?

实施例(使用模板):

#include <cassert> 

template<typename T> 
struct Base { 
    T value {}; 
    Base& operator=(const T& newVal) { this->value = newVal; return *this; } 
}; 

template<typename T> 
struct Child : Base<T> { 
}; 

int main() { 
    Child<int> ch {}; 
    assert(ch.value == 0); 
    ch = 10; // compilation error here 
    assert(ch.value == 10); 
} 

我与编译错误尝试过自己。如果我想这样做,我应该怎么做?这甚至是可能的,或者我必须使用虚拟并覆盖它(或任何可能的 )?

错误C2679:二进制 '运算符':没有操作员发现了采用类型 '类型' 的 右边的操作数(或没有可接受 转换)

编译器:MS的Visual C++ 2015

PS:请告诉我解决方案是否使代码变得难看。

+2

通常包含* exact *编译器错误是一个好主意。还包括编译器名称和版本。 –

+1

谢谢,我会牢记这一点。编译器和错误现在可见。 – tistCoder

回答

10

每个班级宣布operator=。如果你没有明确地做到这一点,那么运算符就会被隐式声明。该(可能是隐含的)声明隐藏了的基本成员。要取消隐藏它,您需要使用using声明:

template <typename T> 
struct Child : Base<T> 
{ 
    using Base<T>::operator=; 
}; 
+0

[Demo](https://ideone.com/Orco3v) –

+0

虽然这样的超载似乎不是一个非常好的主意。 –

+0

你是对的...我最好选择其他方式,因为这段代码不起作用。当然,谢谢大家 – tistCoder

相关问题