Почему это отдельное определение вызывает ошибку? - PullRequest
8 голосов
/ 01 марта 2010

Задача:

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

// 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 голосов
/ 01 марта 2010

Одна ошибка:

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".

3 голосов
/ 02 марта 2010

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

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

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

...