我将以下文件作为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)的未定义引用。我哪里错了?
答案 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中列出你需要的每个显式实例化。