2016-04-17 8 views
3

Ich habe mich gefragt, ob es möglich ist, eine Basisklasse mit Operator-Überladungen zu erstellen, die die Kindklasse (n) verwenden könnte.Kann eine untergeordnete Klasse die Überbelegungsoperatorüberladung des übergeordneten Objekts verwenden?

Beispiel (mit Vorlage):

#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); 
} 

versuchte ich es mir mit einem Compile-Fehler. Was soll ich tun, wenn ich das möchte? Ist das überhaupt möglich oder muss ich virtuell verwenden und überschreiben (oder was auch immer möglich ist)?

Fehler C2679: binary 'Betreiber': kein Operator gefunden, nimmt einen rechten Operand vom Typ 'Typ' (oder gibt es keine akzeptable conversion)

Compiler: MS Visual C++ 2015

PS: Bitte sagen Sie mir, ob die Lösung den Code hässlich macht oder nicht.

+2

Es ist normalerweise eine gute Idee, den * genau * Compiler-Fehler enthalten, die Sie erhalten. Nennen Sie auch den Namen und die Version des Compilers. –

+1

Danke, das werde ich mir merken. Der Compiler und der Fehler sind jetzt sichtbar. – tistCoder

Antwort

10

Jede Klasse erklärt eine operator=. Wenn Sie dies nicht explizit tun, wird der Operator implizit deklariert. Diese (möglicherweise implizite) Deklaration verbirgt das Basiselement. So blenden sie, benötigen Sie eine using Deklaration zu verwenden:

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

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

+0

Obwohl eine solche Überlastung nicht wie eine schrecklich gute Idee scheint. –

+0

Sie haben Recht ... Ich wähle besser einen anderen Weg, weil dieser Code nicht funktioniert. Und natürlich: Danke an euch alle – tistCoder