无法使用单独的.cpp中的模板化成员编译/链接类

时间:2015-04-04 20:26:45

标签: c++ class linker g++

我使用在单独的.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 ++检查)。问题不在于我如何构建代码或文件设置,因为如果我注释掉模板化函数,我就可以编译代码。

1 个答案:

答案 0 :(得分:1)

模板函数必须放在标题中,而不是源文件中。这是因为模板基本上是编译器的指令,告诉他如何为一些模板参数生成代码。这不是定义本身。因此,在实例化特定专业化时,模板“body”必须可用。

直接说,这段代码:

template <typename _t> int myclass::myfunction(const std::vector<_t> *values){
    // do stuff
    return 0;
}

应放在.hpp,而不是.cpp文件中。

您可能还想阅读此问题:link