Por que essa definição separada causa um erro?

Desafio:

Eu tenho esse código que não consegue compilar. Você consegue descobrir o que há de errado? Isso causou dor de cabeça para mim uma 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 correto à primeira vista. Quantos e quais são os erros!

Um erro:

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

é a forma adequada, caso contrário, a análise é

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

e não há membros “valores” com um membro “endereço” dentro de “string” …

ele funcionará para tipos internos, já que eles nunca poderão conter membros .. então int :: values ​​é uma análise não ambígua, int :: values, porque o prior não faz sentido.

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

funciona também. Observe que, se você digitar ty int int sometype; que você teria o mesmo problema usando algum tipo de string acima, mas não com “int”.

Estou atrasado para o jogo, mas preferia escrever o arquivo .cpp como:

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

Claro que isso não resolve o problema que você teve com a declaração de friend .