¿Por qué esta definición separada causa un error?

Reto:

Tengo este código que no comstack. ¿Puedes averiguar 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; 

Se ve bien a primera vista. ¿Cuántos y cuáles son los errores?

Un error:

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

es la forma correcta, de lo contrario el parse es

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

y no hay “valores” de miembro con una “dirección” de miembro dentro de “cadena” …

funcionará para los tipos incorporados, ya que nunca pueden contener miembros … así que int :: values ​​es un análisis no ambiguo, int :: values, porque el anterior no tiene sentido.

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

trabaja tambien Tenga en cuenta que si tipeaf intintype; que tendrías el mismo problema usando algún tipo que con la cadena anterior, pero no con “int”.

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

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

Por supuesto, eso no resuelve el problema que tenía con la statement de friend .