2013-02-20 5 views
0

У меня есть проект DLL с файлом .h, который определяет класс и связанные переменные все в пространстве имен. Это Windows XP с помощью VS 2008. Хотя это очевидно, это GStreamer программы :-)Пространства имен, используемые в нескольких исходных файлах C++

Я хочу, чтобы в пространстве имен IPC_RECEIVER переменной receiverList, но я хочу, чтобы посмотреть на нее за пределами этого пространства имен в, например, соответствующее пространство имен IPC_SENDER.

// IPC-Receiver..h 

#ifndef IPCRECEIVER_H_ 
    #define IPCRECEIVER_H_ 

    namespace IPC_RECEIVER 
    { 
    .... class declaration. 
    } 
    typedef std::list<IPC_RECEIVER::GstReceiver*>    ReceiverList_t; 
    typedef std::list<IPC_RECEIVER::GstReceiver*>::iterator ReceiverListIter_t; 

#endif /* IPCRECEIVER_H_ */ 

Затем CPP файл, в котором переменная g_receiverList объявляется в пространстве имен IPC_RECEIVE, но не в любом классе.

// IPC-ReceeiverAPIs.cpp 
#include "IPC-Receiver.h" 

namespace IPC_RECEIVER 
{ 
    ReceiverList_t g_receiverList; // list to track receivers 
    ... 
} 

И, наконец, третий файл

// IPC-Receiver.cpp 

#include "IPC-Receiver.h" 

extern ReceiverList_t g_receiverList; 

namespace IPC_RECEIVER 
{ 
    GstReceiver::GstReceiver() 
    { 
     g_receiverList.push_back(this); 
    } 
} 

Когда я компилирую это я получаю эту ошибку:

Error 1 error LNK2001: unresolved external symbol 
    "class std::list<class IPC_RECEIVER::GstReceiver *, 
    class std::allocator<class IPC_RECEIVER::GstReceiver *> > g_receiverList" 
    ([email protected]@[email protected]@[email protected] 
    @[email protected]@[email protected]@@[email protected]@@[email protected]@A) 
    IPC-Receiver.obj 

Я пробовал различные комбинации добавления имя пространства имен в экстерном и в конструктор.

С

IPC_RECEIVER::g_receiverList.push_back(this); 

я получаю:

Error 1 error C2039: 'g_receiverList' : is not a member of 
'IPC_RECEIVER' x:\Projects\IPC-dll\IPC-dll\IPC-Receiver.cpp 54 IPC-dll 

И

extern ReceiverList_t IPC_RECEIVER::g_receiverList; 

Я получаю две ошибки:

Error 2 error C2039: 'g_receiverList' : is not a member of 'IPC_RECEIVER' x:\Projects\IPC-dll\IPC-dll\IPC-Receiver.cpp 22  
Error 2 error C2039: 'g_receiverList' : is not a member of 'IPC_RECEIVER' x:\Projects\IPC-dll\IPC-dll\IPC-Receiver.cpp 55 

, где 22 и 54 являются линиями, в которых используется g_receiverList.

используя :: вместо IPC_RECEIVER:: также не работает.

Итак, как мне это сделать: объявить переменную в пространстве имен в одном файле и использовать ее в другом?

Является ли это проблемой порядка ссылок?

ответ

1

Вы должны поместить EXTERN в пространстве имен

namespace IPC_RECEIVER 
{ 
    extern ReceiverList_t g_receiverList; 
} 

И затем использовать его с квалифицированным именем из кода, который не в пространстве имен IPC_RECEIVER.

например.

void main() { 
    IPC_RECEIVER::g_receiverList.push_back(...); 
} 

В вас, например, вы находитесь в пространстве имен IPC_RECEIVER, чтобы вы не нуждались бы в IPC_RECEIVER:: немного.

+0

Bingo! Работал немедленно. –

Смежные вопросы