2010-03-01 13 views
8

Desafío:¿Por qué esta definición separada causa un error?

Tengo este código que no se puede compilar. ¿Puedes descubrir lo que está mal? Me causó dolor de cabeza una vez.

// header 
namespace values { 
    extern std::string address; 
    extern int port; 
} 

// .cpp file 
std::string ::values::address = "192.0.0.1"; 
int   ::values::port = 12; 

Parece correcto a primera vista. ¿Cuántos y cuáles son los errores?

+0

¿Qué dijo el compilador? –

+0

¿Ya sabes la respuesta? Parece que;) –

+0

@Nikolai, es más difícil de probar sin xD –

Respuesta

8

Uno de error:

std::string values::address = "192.0.0.1"; 

es la forma correcta, de lo contrario el análisis sintáctico es

std::string::values::address = "192.0.0.1"; 

y no hay "valores" miembros con una "dirección" miembro de dentro "cadena" ..

funcionará para los tipos integrados, ya que no pueden contener miembros .. tan int :: values ​​es un análisis sin importancia, int :: values, porque lo anterior no tiene sentido.

std::string (::values::address) = "192.0.0.1"; 

funciona también. Tenga en cuenta que si escribedef int tipo; que tendrías el mismo problema al usar algo como lo haces con la cadena anterior, pero no con "int".

+0

ja, eres el ganador. Neat :) –

+0

fijo. según la corrección de litb. –

3

llego tarde al juego, pero yo hubiera preferido escribir el archivo .cpp como:

// .cpp file 
namespace values { 
    std::string address = "192.0.0.1"; 
    int   port = 12; 
} 

Por supuesto que no resuelve el problema que tuvo con la declaración friend.

+0

Sospecho que mi ejemplo inicial con las "direcciones" fue cojo :) El ejemplo de amigo es mucho mejor. Estoy de acuerdo contigo en que esta forma de definición es la mejor :) –

Cuestiones relacionadas