Я пытаюсь создать 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)
шаблоны не может быть частью DLL. У вас могут быть экземпляры шаблонов, которые являются частью DLL. –
@Vaughn не является std :: list в dll? – Nefarious
Нет, это в заголовке. –