2012-04-02 4 views
2

Beim Kompilieren der folgende:Standardzuweisungsoperator für Template-Klasse mit verschiedenen Template-Parameter

template <class T> 
class Number 
{ 
    private: 
     T num; 
    public: 
     Number() {} 
     Number(T n) : num(n) {} 
     operator T() const { return num; } 
}; 

int main() 
{ 
    Number<int> n=5; 
    Number<char> c=4; 
    int i; 

    c=int(5); 
    i=n; 
    c=n; 

    return 0; 
} 

Der Compiler an der dritten Zuweisung klemmt sagen es keine Übereinstimmung für operator= in c=n ist. Sollte nicht n in int konvertiert werden, die wiederum c zugeordnet werden?

Antwort

4

Gemäß dem Standard wird höchstens eine benutzerdefinierte Konvertierung (Konstruktor- oder Konvertierungsfunktion) implizit auf einen einzelnen Wert angewendet. Hier erwarten Sie, dass der Compiler den Konstruktor für Number<char> und den Konvertierungsoperator für Number<int> anwendet. Siehe: https://stackoverflow.com/a/867804/677131.

2

Das liegt daran, dass es keinen int-Operator gibt, wenn Ihre Vorlagenklasse mit dem Templat-Typ char erstellt wird.

Sie haben hier eigentlich keinen Assigment-Operator, nur einen Konstruktor und einen Typ-Operator. Dies bedeutet, dass Ihr Compiler wahrscheinlich in einem Standard eines entlang der Linien von wahrscheinlich setzen würde:

Number<T>& operator=(Number<T>& rhs); 

Sie sollten Ihren eigenen Zuweisungsoperator implementieren, das Ihr Problem beheben soll. Eine generische Lösung könnte wie folgt aussehen, beruht aber auf einer gültigen Zuordnung zwischen den Typen.

template <typename T, typename V> 
class Number 
{ 
    private: 
     T num; 
    public: 
     Number() {} 
     Number(T n) : num(n) {} 
     operator T() const { return num; } 
     operator=(V& rhs){ num = rhs; // etc } 
}; 

Sie müssen auch Ihre Klassenkonstruktors explicit zu vermeiden implizite Konvertierung machen (es sei denn, das ist, was Sie wollen).

+0

'Templates Klasse ist als char 'aufgebaut - ich habe große Probleme herauszufinden, was Sie dort meinen. Eine Klasse, die als _char_ konstruiert wird? – sehe

+0

'n' ist als' int' aufgebaut. Es hat einen "int" -Operator. 'c' kann' int' zugewiesen werden. Übrigens, es funktioniert auch nicht anders, also versucht das Problem nicht, 'int' dem' char' zuzuordnen. – baruch

+0

Können Sie bitte klären? Ich verstehe nicht, was das Problem ist. – baruch

Verwandte Themen