2016-11-27 3 views
1

Я пытаюсь создать DLL библиотеки классов, которая экспортирует класс шаблона. У меня есть локальная версия того же класса, и она должна быть случайной, но она работает правильно. Я знаю, что это на самом деле мало значит, что-то не так.export template class in dll unresolved external

Экспортируемые шаблонный класс в DLL библиотеки:

template <class CcmBlock> 
class CCMSHARED_EXPORT CcmFilter 
{ 
public: 
    CcmFilter() 
    { 
     mBlock = nullptr; 
     ////mBlockList = new std::list<CcmBlock*>(); 
    } 

    void add(CcmFrame* frame) 
    { 
     if (frame == nullptr) 
      return; 

     mBlock = new CcmBlock(
        frame->getFrameData(), 
        frame->getSampleRate(), 
        0xFFFFFFFF, 
        frame->getBlockSize(), 
        frame->getDomain() 
        ); 
     mBlockList->push_back(aBlock); 
    } 

    CcmBlock* get() 
    { 
     return mBlock; 
    } 
private: 
    CcmBlock* mBlock; 
    ////std::list<CcmBlock*>* mBlockList; 
}; 

На стороне приложения:

CcmFilter<FooBlock>* oneFilter = new CcmFilter<FooBlock>(); 
    //Filter<Block>* filter = new Filter<Block>(); 

    CcmFrame* frame = new CcmFrame(0, 50000, 40, 1024, Domain::Time); 

    oneFilter->add(frame); 
    CcmBlock* block = oneFilter->get(); 
    FooBlock* fooBlock = dynamic_cast<FooBlock*>(block); 
    if (fooBlock == nullptr) 
    { //Report Error } 
    else 
    { // Do the work} 

и класс FooBlock является производным от CcmBlock следующим образом:

class FooBlock : public CcmBlock 
{ 
public: 
    FooBlock(int* ipblock, DWORD dwSampleRate, DWORD dwMicrophoneIndex, DWORD dwBlockSize, Domain domain); 

    void process(); 
}; 

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

mainwindow.obj: -1: ошибка: LNK2019: неразрешенный внешний символ "__declspec (dllimport) public: __cdecl CcmFilter :: CcmFilter (void)" (__imp _ ?? 0 ? $ CcmFilter @ VFooBlock @@@@ QEAA @ XZ) ссылка в функции "общественности: __cdecl MainWindow :: MainWindow (класс QWidget *)" (?? 0MainWindow @@ QEAA @ PEAVQWidget @@@ Z)

MainWindow. obj: -1: ошибка: LNK2019: неразрешенный внешний символ "__declspec (dllimport) public: void __cdecl CcmFilter :: add (класс CcmFrame *)" (__imp_? add @? $ CcmFilter @ VFooBlock @@@@ QEAAXPEAVCcmFrame @@@ Z), на которые ссылается функция «public: __cdecl MainWindow :: MainWindow (класс QWidget *)» (? 0MainWindow @@ QEAA @ PEAVQWidget @@@ Z)

+1

шаблоны не может быть частью DLL. У вас могут быть экземпляры шаблонов, которые являются частью DLL. –

+0

@Vaughn не является std :: list в dll? – Nefarious

+0

Нет, это в заголовке. –

ответ

0

Просто не используйте declspec. Но в вашем случае шаблон будет скомпилирован каждый раз, когда вы включаете его в * .cpp-файл. Он не будет экспортироваться.

Для того, чтобы экспортировать некоторые хорошо известные реализаций шаблона вы, вероятно, следует использовать шаблон определения явного Инстанцирование в тандеме с __declspec (экспорт).

+0

Спасибо, я думаю, у меня был мозг F # rt, я знаю, что это в заголовке, я включил его в свой класс приложений и все еще думал об этом как настоящий класс. – Nefarious

0

DLL-файлы загружаются во время выполнения, а шаблоны создаются во время компиляции.

Рабочий процесс, который не идеален, но может работать в очень ограниченном случае использования, заключается в том, чтобы явно создать шаблон где-то после их объявления. То есть, добавить что-то вроде:

template class CcmFilter<FooBlock>; 

Для получения дополнительной информации см https://msdn.microsoft.com/en-us/library/by56e477(VS.80).aspx

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