使用定义文件之外的构造函数

时间:2016-05-30 00:05:17

标签: c++ class constructor

我将以下文件作为class.hpp:

rails s --binding 0.0.0.0

以下文件为class.cpp:

template <class T>
class MyClass{
    public:
    int n;
    MyClass(int N);
};

以下作为test.cpp:

#include "class.hpp"
template <class T>
MyClass<T>::MyClass(int N){
n = N;
}

当我尝试链接文件时,它抱怨对MyClass :: MyClass(int)的未定义引用。我哪里错了?

1 个答案:

答案 0 :(得分:0)

因为编译器必须能够看到模板函数的定义才能实例化它,所以模板定义通常会放在头文件中。在您的代码中,您使用的是MyClass<int>构造函数,但是编译器没有看到它是如何定义的,所以它只是假设它必须在其他地方实例化,但实际上并没有在任何地方实例化它。

可以在单独的源文件中实例化特定参数的模板:

#include "class.hpp"


template <class T>
MyClass<T>::MyClass(int N){
   n = N;
}

template class MyClass<int>; // Force instatiation

这样,模板在定义可见的位置实例化。缺点是你必须在class.cpp中列出你需要的每个显式实例化。