2012-10-01 47 views
9

Estoy tratando de poner en práctica la envoltura genérica en C++ que será capaz de comparar dos cosas que he hecho de la siguiente manera:C++ "No se puede declarar parámetro a ser de tipo abstracto

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

Parecería ser así, no puedo sobrecargar los operadores '<' y '>' de esta manera, así que me pregunto qué puedo hacer para evitar esto.

Respuesta

25

Sus funciones de operador están aceptando sus argumentos por copia. Sin embargo, una nueva instancia de GameNode no se puede construir debido a las funciones virtuales puras. Probablemente quiera aceptar esos argumentos por referencia en su lugar.

+1

Eso hizo el truco, gracias! –

6

Los tipos abstractos solo son útiles porque son polimórficos y en de hecho, DEBEN ser utilizados de forma polimórfica (esta es la diferencia entre virtual y puro virtual, aka, resumen).

El polimorfismo requiere una referencia o puntero. Quieres una referencia en este caso.

Pasando por valor intenta crear un nuevo objeto copiando el argumento, pero no es posible crear una instancia de un tipo abstracto. Pasar por referencia utiliza la instancia existente en lugar de crear una nueva y evita este problema.

Cuestiones relacionadas