2012-04-14 9 views
1

Das folgende Beispiel definiert eine grundlegende Podtype- Container-Klasse. Unter Verwendung dieser Klasse wird dann eine Reihe von typedefs erzeugt, die eine OOP-Version des grundlegenden podtype darstellen. Das Problem entsteht, wenn wir beginnen, diese Typen einander zuzuweisen.C++ - Template-Operator, der mit verschiedenen Typen überlädt

Ich habe versucht, den Operator als Freund Methode mit LHS und RHs Argumente mit einfachen PodObjects als Typ, aber ohne Erfolg zu definieren. Gibt es jemanden, der etwas Ähnliches erlebt hat oder eine andere Lösung für dieses Problem kennt?

Vielen Dank im Voraus.

#include <stdint.h> 

template <typename T> 
class PodObject { 
protected: 
    T _value; 

public: 
    PodObject<T>(int rhs) { 
     this->_value = static_cast<T>(rhs); 
    } 

    PodObject<T> operator+= (PodObject<T> const &rhs){ 
     this->_value = rhs._value; 
     return *this; 
    } 
}; 

typedef PodObject<int8_t> Int8; 
typedef PodObject<int16_t> Int16; 

int main() { 
    Int16 a = 10; 
    Int8 b = 15; 

    a += b; // Source of problem 
    return 0; 
} 

Ergebnisse in einem Compiler Ausgabe:

example.cpp:26:11: error: no viable overloaded '+=' 
     a += b; 
     ~^~ 
example.cpp:13:22: note: candidate function not viable: no known conversion from 'Int8' (aka 'PodObject<int8_t>') to 'const PodObject<short>' 
     for 1st argument 
     PodObject<T> operator+= (PodObject<T> const &rhs){ 

EDIT:

Der Freund Methode der Job für mich unten hat:

template<typename U, typename W> 
friend PodObject<U> operator+= (PodObject<U> &lhs, PodObject<W> const &rhs) { 
    lhs._value += rhs._value; 
    return lhs; 
} 

Antwort

4

Sie benötigen einen Templat- operator + weil du bist versuchen verschiedene Typen hinzuzufügen:

template <typename U> 
PodObject<T> operator+= (PodObject<U> const &rhs){ 
    this->_value = rhs._value; 
    return *this; 
} 

Das heißt, sieht das ganze Code wie ein Anti-Muster. Ihre "OOP-Version des grundlegenden Podtyps" ist kein sinnvolles oder allgemein nützliches Konzept.

+1

+1 für "nicht sinnvoll, nicht nützlich". –

+0

Es war mehr ein Experiment als etwas vernünftig, und ja, ich werde in die Hölle der Programmierer gehen :). Aber danke für die Antwort, die Mitgliedervariable muss jedoch öffentlich sein, damit dies funktioniert. – Roy

+0

Die Member-Variable muss nicht "public" sein, wenn Sie sich 'PodObject'-Freunde von einander machen:' template friend PodObject ; 'P.S. Sie gehen nur zur Hölle des Programmierers, wenn Sie diesen Code wirklich liefern. –

Verwandte Themen