2011-10-20 24 views
7

Actualmente estoy portando una aplicación C++ a un entorno ligeramente restringido. La aplicación utiliza las clases STL, de cadena y de transmisión. Estoy reescribiendo versiones simplificadas de estos que jugarán muy bien en mi entorno.C++ Falló sin la definición de operador

Lo que me preocupa es que mi aplicación se está compilando incluso sin todas las definiciones de operador necesarias. Por ejemplo, para mis clases de cadena definí:

string operator+ (const string& lhs, const string& rhs); 

y esto fue suficiente. Sin embargo, noté que a menudo había casos que tenían mystring + "alguna cadena constante" y esto no está definido en mi código en ninguna parte. Cuando lo agregué explícitamente, se utilizó:

string operator+ (const string& lhs, const char* rhs); 

¿Qué estaba pasando antes de eso? Se compiló con éxito antes de agregar la segunda función. Seguramente el compilador no podría inferir cómo concatenar cadenas de estilo c a mi clase de cadenas.

Tengo un comportamiento extraño en mi programa ahora y me pregunto si es debido a que otros operadores no están definidos. ¿Hay alguna manera de hacer cumplir el compilador para requerir tales definiciones de operador si el programa lo necesita?

P.S. Mi clase de cadena está en un espacio de nombres único y no relacionado con std ::

+2

¿Tiene una conversión implícita o un constructor que convierta de 'const char *' a su clase 'string'? –

+0

Sí, mi clase de cadena tiene un constructor con un parámetro "const char * cstr". ¿Crees que podría ser eso? – hayesti

+0

@Bob: [Esta pregunta] (http://stackoverflow.com/questions/2346083/) podría ser de su interés. –

Respuesta

12

Es imposible estar seguro sin ver el resto de su código, pero en este caso probablemente tampoco sea demasiado difícil de adivinar. Es casi seguro que tenga un constructor para su string que toma como parámetro char const *, entonces lo que está sucediendo es que el compilador está usando ese ctor para convertir el char const * a string, luego usando string operator+ (const string& lhs, const string& rhs); para concatenar eso.

Permitir que esto suceda es uno de (si no es el) motivo principal para sobrecargar estos operadores con funciones globales en lugar de funciones miembro. Como funciones miembro pueden convertir el operando a la derecha, pero no a la izquierda.

2

Cuando pasó un const char*, probablemente se construyó un objeto de cadena y se pasó al operador +. Si revisa el código en un depurador, probablemente podrá verificar que se está llamando al constructor.

2

Probablemente, tenga un constructor en su clase que tome const char * como parámetro de entrada. Lo más probable es que este constructor se utilice para coberturas implícitas y el comportamiento extraño que ve.

Declara tu constructor que toma const char * como explicit, esto inhabilitaría su uso para las conversiones implícitas donde no pretendas que se use.

2

¿Su clase 'string' tiene un constructor de un argumento que toma un const char *? ¿Ese constructor de un solo argumento está marcado como 'explícito'?

Si no es explícito, la respuesta más probable es que el compilador está construyendo un objeto de cadena temporal a partir de char * a través de su constructor de conversión y luego usando esa cadena temporal para llamar a su operador de adición de dos argumentos.

1

El compilador no puede saber cómo convertir su cadena a std::string o char* a menos que especifique cómo.

Busque constructores de conversión u operadores de conversión en su declaración de clase.

class MyString 
{ 
    MyString(char*); 
    MyString(std::string); 

    operator std::string(); 
    operator char*(); 
}; 

Se denominarán implícitamente.

Puede especificar la palabra clave explicit para su constructor para evitar que esto suceda.

Si esto no soluciona el problema, debe tener los operadores sobrecargados en alguna parte, lo mejor es encontrarlos pasando el código con un depurador.

Cuestiones relacionadas