Почему это отдельное определение вызывает ошибку?
Вызов:
У меня есть этот код, который не удается скомпилировать. Ты можешь понять, что случилось? Однажды это вызвало у меня головную боль.
// 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 ответа:
Одна ошибка:
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".