2009-04-07 27 views
5

Error:
error C2678: binario '==': ningún operador encontró que toma un operando de la izquierda del tipo 'entrada const' (o no hay conversión aceptable)C error clase de plantilla ++ con == operador

La función:

template <class T, int maxSize> 
int indexList<T, maxSize>::search(const T& target) const 
{ 
    for (int i = 0; i < maxSize; i++) 
     if (elements[i] == target) //ERROR??? 
      return i;  // target found at position i 

    // target not found 
    return -1; 
} 

indexList.h
indexList.cpp

es esto supone que debe ser un operador sobrecargado? Al ser una clase de plantilla, no estoy seguro de entender el error.

Solution- la función de sobrecarga en la clase const ahora declarado:

//Operators 
bool entry::operator == (const entry& dE) const <-- 
{ 
    return (name ==dE.name); 

} 
+0

http://stackoverflow.com/a/38887476/1599699 – Andrew

Respuesta

9

Comience por leer el texto de error tal y como es:

binary '==' : no operator found which takes a left-hand operand of type 'const entry'

Esto significa que no puede encontrar cualquier operador == que acepta un tipo entry como su operando izquierdo. Este código no es válido:

entry const e; 
if (e == foo) 

que nos has mostraron el código para la clase de lista, pero eso no es lo que es el error acerca. El error es sobre la falta de operadores para el tipo entry, sea lo que sea. O bien, otorgue a la clase una función operator== o declare una función independiente operator== que acepte un const entry& como su primer parámetro.

struct entry { 
    bool operator==(const entry& other) const; 
}; 
// or 
bool operator==(const entry& lhs, const entry& rhs); 

Creo que este último es el estilo preferido.

+0

Gracias. Mi clase tenía el operador sobrecargado, pero la función no fue declarada como const –

6

El problema se refiere al tipo T que se utiliza en este caso no tener un operador == definido. Supongo por su pregunta que esta es una 'entrada' de clase.

También podría ser que la clase 'entrada' no tenga el operador == definido correctamente para tomar una entrada const & como parámetro.

+0

bingo, podría valer la pena explicar las definiciones correctas aunque (función friend en línea) o podría haber algunos * Problemas de enlazador * FUN * más tarde = D –

+0

¿por qué los elementos tienen que ser const? –

+0

Porque su método de plantilla está marcado const. Eso significa que el compilador debe verificar que no llame operaciones no const en los datos internos de la clase (elemento [i]) –

2

Esto es probable "envenenamiento const", donde el uso de const en la declaración de su función de búsqueda le obligará a agregar const versiones de todas las funciones descendentes que llame.

En una función declarada const, el puntero this se considera const, lo que significa que todos los miembros que utiliza a través de ese puntero se consideran const también. Si su operator ==() para el tipo T con el que se está especializando no especifica explícitamente los parámetros const, obtendrá este error.

Si no puede asegurarse de que todas las Ts que utiliza tengan las llamadas operator ==() correctas, eliminaría los especificadores const en las plantillas de funciones miembro.

+0

En la clase de plantilla, el operador == no está definido, ¿tiene que ser así? ¿Cuál es la mejor manera de eliminar esta intoxicación const en esta función? –

+0

el término "envenenamiento por const" es bastante engañoso. las ventajas están ahí para evitar cometer errores y mantener las restricciones en orden. Si agregar un const en un lugar significa que necesita agregarlo en otros lugares, significa que probablemente ya lo haya hecho antes. – shoosh

+0

Solo eliminaría el "const" después de las declaraciones en el encabezado. Puede crear una plantilla contenedora habilitada para operador ==(), pero es probable que tenga más problemas de los que merece. – mwigdahl

1

El tipo T que está utilizando como parámetro para esta clase debe tener un operator==(), ya que el código que proporciona no contiene la instanciación de la plantilla, es difícil saber cuál es el problema.

En una nota diferente, las definiciones de función de una plantilla deben estar en el archivo .h junto con la clase o de lo contrario el compilador no podría instanciarla correctamente.

+0

tienen definiciones en .h –

1

El operador de igualdad para los tipos definidos por el usuario no está definido por defecto. Esto no tiene nada que ver con su clase de plantilla, sino con su struct o class "entrada".

Por lo tanto, tendrá que anular el operador de igualdad en struct entry o class entry.

Como alternativa, si no desea forzar todo lo que utiliza esa plantilla para definir un operador de igualdad, puede modificar la interfaz de la plantilla para aceptar un Comparador que haga la comparación de igualdad.

0

A veces es más que suficiente para escribir

... 
    if (target == elements[i]) 
... 
Cuestiones relacionadas