2013-07-28 1 views
1

У меня есть класс в заголовке:Декларирование моего объекта как экстерн дает «не заявил в этой области» ошибка

class Communicator { 
public: 
std::map<std::string,obj::obj_version<obj::tkt_metadata>*> local_objects; 
} 

Когда я компилирую я могу создать Communicator позже в коде и использовать карту в обычном режиме , без проблем.

Однако, как только я кладу после объявления класса:

extern Communicator comm; 

И добавить:

Communicator comm; 

В файле реализации для заголовка, я получаю «ошибка: 'OBJ' был не объявлен в этой области »и т. д., где obj - это пространство имен, которое содержит obj_version и tkt_metadata (и предшествует включению моего заголовка коммуникатора).

Что здесь происходит, и есть ли что-нибудь, что я могу сделать, чтобы его правильно скомпилировать? Благодаря!

ответ

0

Вы забыли ; в своем реальном коде или просто забыли поставить его здесь?

class Communicator { 
public: 
    std::map<std::string,obj::obj_version<obj::tkt_metadata>*> local_objects; 
}; // <<<<< Note the ';' here! 
1

О, я только что открыл проблему с помощью полезного комментария (он был удален).

Так один из моих файлов заголовков object.h (который не содержит Communicator но объекты, которые Communicator работает на самом деле) выглядит немного как это:

-- obj_version and tkt_metadata 
-- #include "communicator.h" 
-- more stuff 

Мой файл реализации, как это было:

-- #include "communicator.h" 
-- define the functions 
-- Communicator comm; 

Тем не менее, кто-то в комментарии упоминал «Компиляционная единица» на C++. Оказывается, заголовки не скомпилированы сами по себе, только файлы реализации скомпилированы и заголовки просто созданы для каждого файла реализации.

Таким образом, хотя мой Communicator был включен после моих объектов, которые ему нужно было видеть (в объекте.h), файл реализации включал только коммуникатор.h, а не object.h (который в свою очередь включает в себя Communator.h). Компилятор попытался скомпилировать Communicator, не имея перед ним объектов в пространстве имен obj.

Так что ответ поставить в communicator.cc:

-- #include "objects.h" 
-- define the functions 
-- Communicator comm; 

Это довольно простая задача (и, вероятно, не был бы подотчетен кем только ту информацию, которую дал), но спасибо, вы сделали я решаю свое собственное недоразумение!