提问人:CoAstroGeek 提问时间:11/2/2023 最后编辑:Ted LyngmoCoAstroGeek 更新时间:11/2/2023 访问量:54
实现类模板的成员函数 [duplicate]
Implementing member functions of a class template [duplicate]
问:
好的,我想我错过了一些关于模板的基本知识。
我有一类星历数据,最初定义为:
class EphemerisPoint;
class Ephemeris
{
private:
vector<EphemerisPoint> data;
public:
StateVector interpolate(double time);
};
其中插值在 CC 文件中定义:
StateVector Ephemeris::interpolate(double time)
{
...
}
我有一个用例,我想用 boost::circular_buffer<> 替换 vector<>
所以我把它做成一个类模板:
class EphemerisPoint;
template <class T> class Ephemeris
{
private:
T data;
public:
StateVector interpolate(double time);
};
以及 interpolate() 的实现:
template<class T> StateVector Ephemeris<T>::interpolate(double time)
{
...
}
这些都编译到一个库中。
但是当我使用它时:
Ephemeris<boost::circular_buffer<EphemerisPoint> > ephem;
ephem.interpolate(10.0);
它编译良好 - 但是当链接到库时,我收到如下消息:
undefined reference to `Ephemeris<boost::circular_buffer<EphemerisPoint, std::allocator<EphemerisPoint> > >::propagate(double)'
如果我通过 nm 运行库,我会看到库中没有 Ephemeris::interpolate??
但是,如果在这个大型库的其他地方,我实例化并使用 Ephemerisboost::circular_buffer<EphemerisPoint >对象,那么 boost::circular_buffer 的相应 Ephemeris::interpolate() 函数将存在于库中,我可以在链接到它的程序中使用它。
但是,如果我尝试实例化旧的基于向量的向量,则不会再次链接。
我是否必须使用我打算使用的每种模板类型在库中实例化 Ephemeris 版本?这似乎与我认为模板的工作方式不一致。
gcc 4.8.5,在 CentOS 7 FWIW 上使用 -std=gnu++11
答:
好的,上面的评论让我找到了一个答案,该答案不涉及将 10K 行代码移动到我的头文件中。
我认为这也可以让我将允许的模板类限制为 vector 和 boost::circular_buffer
去尝试一下 - 这可能是许多其他问题的重复,例如:将 C++ 模板函数定义存储在 .CPP 文件,所以如果你愿意,请随时关闭它。
评论
下一个:指向模板化虚拟基类的指针的问题
评论
<algorithm>