我有一个名为“SimObject”的类:
namespace simBase
{
class __declspec(dllexport) SimObject: public SimSomething
{
public:
template <class T>
void updateParamValue( const std::string& name, T val );
}
}
我还有一个名为“ITerrainDrawable”的类:
namespace simTerrain
{
class __declspec(dllexport) ITerrainDrawable : public simBase::SimObject
{
}
}
这些类位于不同的库中。 SimObject位于simBase中,ITerrainDrawable位于simTerrain库中。即使ITerrainDrawable派生自SimObject,并且包含了simBase库,我也会收到链接错误:
1>ITerrainDrawable.obj : error LNK2019: unresolved external symbol "public: void __thiscall simBase::SimObject::updateParamValue<float>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,float)" (??$updateParamValue@M@SimObject@simBase@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@M@Z) referenced in function "public: void __thiscall simTerrain::ITerrainDrawable::setTerrainSize(float)" (?setTerrainSize@ITerrainDrawable@simTerrain@@QAEXM@Z)
1>ITerrainDrawable.obj : error LNK2019: unresolved external symbol "public: void __thiscall simBase::SimObject::updateParamValue<class osg::Vec4f>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class osg::Vec4f)" (??$updateParamValue@VVec4f@osg@@@SimObject@simBase@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@VVec4f@osg@@@Z) referenced in function "public: void __thiscall simTerrain::ITerrainDrawable::setSatelliteTextureBorders(class osg::Vec2f,class osg::Vec2f)" (?setSatelliteTextureBorders@ITerrainDrawable@simTerrain@@QAEXVVec2f@osg@@0@Z)
为什么会出现此错误?
如果我不使用模板功能,但我需要它,一切都可以正常工作。
如果我将此函数移至simTerrain库,则可以正常工作,但由于包含simTerrain这样的许多库,我不想使用重复函数。
最佳答案
C++确实不支持模板代码的单独编译-您需要将模板的定义放在头文件中。
关于c++ - 无法导出模板功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1969343/