我使用在单独的.hpp / .cpp文件中指定的类来使用C ++。这个类具有模板化成员函数的特殊性,该函数以const std::vector
为参数,这是问题的根源。
myclass.hpp
:
class myclass {
//...
public:
myclass();
template <typename _t> int myfunction(const std::vector<_t> *values);
//...
}
myclass.cpp
:
#include "myclass.hpp"
//...
template <typename _t> int myclass::myfunction(const std::vector<_t> *values){
// do stuff
return 0;
}
和我的main.cpp
:
#include "myclass.hpp"
int main(int argc, char const *argv[]){
myclass foo;
std::vector<int> bar(5,100);
foo.myfunction(bar);
return 0;
}
然而,当我尝试使用g++ main.cpp myclass.cpp -o main -I /usr/include
编译所有这些时,我收到错误:
undefined reference to `int myclass::myfunction<int>(std::vector<int, std::allocator<int> > const*)'
这很奇怪,因为语法似乎是正确的(它通过g ++检查)。问题不在于我如何构建代码或文件设置,因为如果我注释掉模板化函数,我就可以编译代码。
答案 0 :(得分:1)
模板函数必须放在标题中,而不是源文件中。这是因为模板基本上是编译器的指令,告诉他如何为一些模板参数生成代码。这不是定义本身。因此,在实例化特定专业化时,模板“body”必须可用。
直接说,这段代码:
template <typename _t> int myclass::myfunction(const std::vector<_t> *values){
// do stuff
return 0;
}
应放在.hpp
,而不是.cpp
文件中。
您可能还想阅读此问题:link。