我读过这个页面为什么模板只能在头文件中实现?但它是关于一个模板类的。构造函数采用和类相同的类型(若类为<int>,构造函数也采用int,依此类推)。但我有一个简单的(非模板)类。很抱歉重复,请解释一下在这种情况下我该怎么办?
我有一个字段为"double d"的类"Object",我想创建一个模板构造函数。如果我在类内实现它,一切都很好,但如果将实现从.h移动到.cpp,那就不起作用了。这是我的代码:
Object.h
class Object {
double d;
public:
template <class T> Object(T t);
};
对象.cpp
#include "Object.h"
template <class T> Object::Object(T t) {
d = t;
}
main.cpp
#include "Object.h"
int main() {
int a = 5;
Object x(a);
float b = 2.5;
Object y(b);
return 0;
}
错误出现在main.cpp中创建x和y的行中,有:
undefined reference to `Object::Object<int>(int)'
undefined reference to `Object::Object<float>(float)'
去掉Object.cpp
并将其内容移动到头文件中。
当编译器处理Object.cpp
时,它不生成任何字节码,因为只有一些模板。当它在代码中遇到Object::Object<int>(int)
的"提及"时,它会转到头文件,推导模板参数并成功编译所有内容。
然而,链接者并不高兴。它看到对Object::Object<int>(int)
的调用,但找不到此方法的字节码,并引发错误。
否则,您可以在main
中定义template <class T> Object::Object(T t)
,但这不太好,可能会导致混淆。
您必须实现要在头文件中使用的所有模板。如果您只在.cpp文件中实现它们,那么只有.cpp文件才能看到它。