2012-10-01 12 views
9

Sto cercando di implementare wrapper generico in C++ che sarà in grado di confrontare due cose che ho fatto come segue:C++ "non può dichiarare il parametro per essere di tipo astratto

template <class T> 
class GameNode { 
    public: 
     //constructor 
     GameNode(T value) 
      : myValue(value) 
     { } 

     //return this node's value 
     T getValue() { 
      return myValue; 
     } 

     //ABSTRACT 
     //overload greater than operator for comparison of GameNodes 
     virtual bool operator>(const GameNode<T> other) = 0; 

     //ABSTRACT 
     //overload less than operator for comparison of GameNodes 
     virtual bool operator<(const GameNode<T> other) = 0; 

    private: 
     //value to hold in this node 
     T myValue; 
}; 

Sembrerebbe per essere non posso sovraccaricare gli operatori '<' e '>' in questo modo, quindi mi chiedo cosa posso fare per aggirare questo.

risposta

25

Le funzioni dell'operatore accettano i loro argomenti tramite copia. Tuttavia, una nuova istanza di GameNode non può essere costruita a causa delle pure funzioni virtuali. Probabilmente vorrai accettare quegli argomenti per riferimento, invece.

+1

Questo ha fatto il trucco, grazie! –

6

I tipi astratti sono utili solo perché sono polimorfici, e in infatti DEVONO essere usati in modo polimorfico (questa è la differenza tra virtuale e pure virtuale o astratto).

Il polimorfismo richiede un riferimento o un puntatore. Vuoi un riferimento in questo caso.

Il passaggio per valore tenta di creare un nuovo oggetto copiando l'argomento, ma non è possibile creare un'istanza di un tipo astratto. Il passaggio per riferimento utilizza l'istanza esistente anziché crearne una nuova ed evita questo problema.

Problemi correlati