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

Проблема:

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

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

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

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

8
задан Mooing Duck 9 September 2013 в 18:28
поделиться

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

8
ответ дан 5 December 2019 в 15:22
поделиться

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

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

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

3
ответ дан 5 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: