Почему это отдельное определение вызывает ошибку?


Вызов:

У меня есть этот код, который не удается скомпилировать. Ты можешь понять, что случилось? Однажды это вызвало у меня головную боль.

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

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

Это выглядит правильным на первый взгляд. Сколько и каких ошибок!?

2 8

2 ответа:

Одна ошибка:

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

Является правильной формой, в противном случае разбор будет

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

И нет никакого члена " values "с членом" address "внутри"string"...

Он будет работать для встроенных типов, так как они никогда не могут содержать членов.. таким образом, int::values-это однозначный синтаксический анализ, int ::values, потому что предыдущий не имеет смысла.

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

Тоже работает. Обратите внимание, что если вы наберете typedef int sometype; что у вас будет та же проблема с использованием sometype, что и со строкой выше, но не с "int".

Я опаздываю на игру ,но я бы предпочел написать.cpp файл как:

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

Конечно, это не решает проблему, которую вы имели с объявлением friend.