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

时间:2016-04-10 19:50:42

标签: c++ templates

我已阅读此页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)'

2 个答案:

答案 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文件才能看到它。