【问题标题】:gcc linking error on template method模板方法上的 gcc 链接错误
【发布时间】:2012-05-13 13:21:46
【问题描述】:

我遇到了这个链接器错误,并且在通过它时遇到了一些麻烦。

o/foo/bar.cc.o: In function 'foo::bar()': bar.cc:(.text+0x728): undefined reference to 'rf<PlayerInfo> Util::getClosestToGlobal<PlayerInfo>(std::vector<rf<bats::PlayerInfo>, std::allocator<rf<PlayerInfo> > >, Eigen::Matrix<double, 3, 1, 2, 3, 1>)'

Util.h 文件定义:

template <class ObjectClass>
static rf<ObjectClass> getClosestToGlobal(
    std::vector<rf<ObjectClass> > objects, Eigen::Vector3d targetPosGlobal);

Util.cpp 定义:

template <class ObjectClass>
rf<ObjectClass> Util::getClosestToGlobal(
    std::vector<rf<ObjectClass> > objects, Eigen::Vector3d targetPosGlobal)
{
    // ...
}

我知道我的 cpp 文件编译成功,因为它按预期重新创建了 .o 文件。

我是否在此处提供了足够的信息以供更有经验的人识别问题?如果没有,我还应该去哪里寻找?

【问题讨论】:

标签: c++ gcc linker-errors


【解决方案1】:

模板类/方法定义应该可用in the header file

【讨论】:

  • 您链接到的信息与您的声明中的“必须”部分相矛盾,假设您知道在编译时将在模板中使用的类型(在这种情况下我会这样做)。有用资料,谢谢。我喜欢学习 C++。
  • 这种情况并不常见。无论如何我都会修改“必须”,但定义模板的正确方法是在头文件中定义它们,或者创建另一种类型的文件(有时是“.ipp”),该文件将包含在您的末尾标题。这只是一种解决方法。
【解决方案2】:

您需要在声明它的头文件中定义您的模板化函数。

【讨论】:

  • 模板函数总是这样吗?
  • AFAIK。 C++11 为此添加了extern templates,但我认为它们已经被删除了。
  • 谢谢,这行得通。如果您提前知道模板类型,您似乎可以在 cpp 文件中定义模板方法。看到这个问题:stackoverflow.com/questions/115703/…
猜你喜欢
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
相关资源
最近更新 更多