我已阅读此页Why can templates only be implemented in the header file? 但它是关于模板类的。构造函数采用与类相同的类型(如果类是< int>,构造函数也采用int,依此类推)。但我有简单的(非模板)类。很抱歉重复,请解释在这种情况下我该怎么做?
我有一个带有'double d'字段的'Object'类,我想创建一个模板构造函数。如果我在课堂上意识到它,一切都很好,但如果将实现移到课堂外(从.h到.cpp),它就不起作用了。这是我的代码:
Object.h
class Object {
double d;
public:
template <class T> Object(T t);
};
Object.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;
}
在创建x和y的行中main.cpp中出现错误,有:
undefined reference to `Object::Object<int>(int)'
undefined reference to `Object::Object<float>(float)'
答案 0 :(得分:1)
摆脱Object.cpp
并将其内容移至头文件。
当编译器处理Object.cpp
时,它不会生成任何字节代码,因为只有一些模板。当它遇到“提及”时。在代码中Object::Object<int>(int)
,它转到头文件,推断模板参数并成功编译所有内容。
然而,链接器并不高兴。它看到对Object::Object<int>(int)
的调用,但无法找到此方法的字节代码并引发错误。
否则,您可以在template <class T> Object::Object(T t)
中定义main
,但这样做不太好,可能会导致混淆。
答案 1 :(得分:0)
您必须在头文件中实现要使用的所有模板。如果只在.cpp文件中实现它们,那么只有.cpp文件才能看到它。