【发布时间】:2017-04-11 11:20:02
【问题描述】:
我正在尝试创建一个导出模板类的类库 dll。我有同一个类的本地版本,它一定是巧合,但它工作正常。我知道这并没有多大意义,显然有问题。
库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: error: LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl CcmFilter::CcmFilter(void)" (__imp_??0?$CcmFilter@VFooBlock@@@@QEAA@XZ ) 在函数“public: __cdecl MainWindow::MainWindow(class QWidget *)”中引用 (??0MainWindow@@QEAA@PEAVQWidget@@@Z)
mainwindow.obj:-1: error: LNK2019: unresolved external symbol "__declspec(dllimport) public: void __cdecl CcmFilter::add(class CcmFrame *)" (__imp_?add@?$CcmFilter@VFooBlock@@@@函数“public: __cdecl MainWindow::MainWindow(class QWidget *)”中引用的 QEAAXPEAVCcmFrame@@@Z) (??0MainWindow@@QEAA@PEAVQWidget@@@Z)
【问题讨论】:
-
模板不能是 DLL 的一部分。您可以拥有属于 DLL 一部分的模板实例化。
-
@Vaughn 不是 dll 中的 std::list 吗?
-
不,它在标题中。
-
@Vaughn 我数不清有多少次我读到“这是一个标题,而且确实是”,但仍然对它在 dll 中的心理障碍感到恼火。谢谢,感谢您再次向我指出这一点:)