2016-04-17 17 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

相關問題