Проблема с дублирующимся символом - PullRequest
0 голосов
/ 09 августа 2010

У меня есть файл заголовка MyNameSpace.h, где я использую пространство имен, как показано ниже:

namespace NameSpace1

{
string first = "First";
...
}

namespace NameSpace2

{
string top = "Top";
}

Но когда я использую объект пространства имен в других моих классах, включая файл заголовка.Я получил Дублирующую ошибку символа как NameSpace1 :: first.Что именно это означает и как решить это решение.

Ответы [ 3 ]

15 голосов
/ 09 августа 2010

Вы не должны определять глобальные переменные в заголовках, вам нужно сообщить компилятору, что он определен в другом месте с ключевым словом extern.В противном случае компилятор пытается определить переменную в каждом исходном файле, который содержит заголовок.

Например.в MyNameSpace.h вы делаете:

namespace NameSpace1 {
    extern std::string first;
}

Затем вы делаете это в MyNameSpace.cpp:

namespace NameSpace1 {
    std::string first = "First";
}
0 голосов
/ 09 августа 2010

@ reko_t: Защита от включения не помогает против определения нескольких переменных, поскольку защита включает только от множественного включения на одну единицу компиляции (например, исходный файл).

Нетт, что на самом деле мешает множественным определениям?

0 голосов
/ 09 августа 2010

Прежде всего не может быть объекта пространства имен, вы не можете создать объект из пространства имен.Он существует только для разрешения имен.Что касается проблемы множественного определения, вы, скорее всего, упускаете include guard для заголовочного файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...