如何分离模板构造函数的实现(如果类不是模板)



我读过这个页面为什么模板只能在头文件中实现?但它是关于一个模板类的。构造函数采用和类相同的类型(若类为<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文件才能看到它。

相关内容

最新更新