未解决的外部符号?

时间:2010-10-21 14:27:51

标签: c++ ogre3d

  

可能重复:
  What is an undefined reference/unresolved external symbol error and how do I fix it?

我在阅读c ++错误方面很糟糕,但显然未解析的外部符号意味着我正在使用的函数未定义。我得到的错误是......

1>WorldState.obj : error LNK2001: unresolved external symbol "public: class Brutal::GameObject * __thiscall Brutal::GameObjectManager::createObject<class Player>(class Ogre::Vector3,class Ogre::Quaternion,class Brutal::PropertyList,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??$createObject@VPlayer@@@GameObjectManager@Brutal@@QAEPAVGameObject@1@VVector3@Ogre@@VQuaternion@4@VPropertyList@1@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>C:\Users\Brett\Desktop\Factions Online\build\release\client\client.exe : fatal error LNK1120: 1 unresolved externals

这没有任何意义,因为当我右键单击并点击“转到定义”时,定义了createObject,甚至在MSVC中适当地出现了

我的代码叫做......

Brutal::GameObjectManager::getSingletonPtr()->createObject<Player>(Ogre::Vector3::ZERO, Ogre::Quaternion::IDENTITY);

所以我错过了一些愚蠢的东西吗?

4 个答案:

答案 0 :(得分:2)

由于您使用的是模板功能,因此在调用它时必须能够看到它的定义。因此,因为这是一个成员函数,所以必须在声明它的头文件中实现它。

答案 1 :(得分:1)

鉴于它是一个模板,您是否将实现放在与标题不同的文件中? (对于您决定声明自己有模板实现的特定类,可以执行此操作,称为实例化)。

我将扩展我以前的帖子,因为我可以在这里比在评论中更容易提出编码建议。

您有一个名为createObject的模板函数。你可能会考虑“重构”这个来使用一个类,因为单击这个更容易。

这是示例代码,因此请填写详细信息以使其适用于您的确切示例。

class GamePlayerManager
{
public:
   // all the other stuff
   template< typename T > createObject(/*params */)
   {
     // implement inline
       res = GameObjectFactory<T>::create(/* whatever parameters */);
   }
};

我现在已经将对象创建单独添加到自己的名为GameObjectFactory的类中。在Player可见的某个点上,您可以在隐藏其create()方法的同时实例化该模板。

template class GameObjectFactory<Player>;

这足以让编译器知道它需要查看实现以实现此类的函数(它将它提升为“真正的”类,以便您可以将实现放入其.cpp文件中)。请注意,这是一个实例化,而不是专业化,因此您的模板GameObjectFactory仍然可以实现您想要内联的任何函数,您不必为您的类重新定义它们。这是“重用”公共代码的好方法,同时允许您专注于某些细节。

答案 2 :(得分:0)

看起来你没有链接到相关的库。你已经包含了标题,所以编译器没有抱怨,但链接器不知道你在说什么。

答案 3 :(得分:0)

createObject是默认参数还是重载?

如果是,您是否定义了该功能的所有版本?

在错误消息中,它显示的功能参数多于调用中的参数。

如果在其他库中定义了函数,则必须通过在项目设置中将该库作为输入提供给链接器来将其与应用程序链接。