Проблема:
У меня есть этот код, которому не удается скомпилировать. Можно ли выяснить что случилось? Это вызвало головную боль мне однажды.
// header
namespace values {
extern std::string address;
extern int port;
}
// .cpp file
std::string ::values::address = "192.0.0.1";
int ::values::port = 12;
Это выглядит корректным на первом взгляде. Сколько и которые являются ошибками!?
Одна ошибка:
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
.