链接时间内对部分专用模板类函数的未定义引用

时间:2012-11-08 18:03:36

标签: c++ templates linker specialization partial-specialization

所以我遇到了功能模板部分特化的问题。我选择此处描述的解决方案:Question

现在我有了这个:

#include <vector>
#include <iostream>

template <typename T> struct helper {
    static void print(T value) { std::cout << value; }
};
template <typename T> struct helper<std::vector<T>> {
    static void print(std::vector<T> const &value) { }
};

template <typename T>
void print (T const &value) {
    // Just delegate.
    helper<T>::print (value);
}


int main () {
    print (5);
    std::vector<int> v;
    print (v);
}

但我想要这个布局:

helper.hpp

#include <vector>
#include <iostream>

template <typename T> struct helper {
    static void print(T value) { std::cout << value; }
};

vector_helper.cpp

#include <vector>
#include <iostream>

template <typename T> struct helper<std::vector<T>> {
    static void print(std::vector<T> const &value) { }
};

print.hpp

#include "helper.hpp"

template <typename T>
void print (T const &value) {
    // Just delegate.
    helper<T>::print (value);
}

的main.cpp

#include "print.hpp"

int main () {
    print (5);
    std::vector<int> v;
    print (v);
}

编译如下:

g++ main.cpp vector_helper.cpp

问题是MinGW正在产生链接时错误:未定义引用helper<vector<...>>::print(vector<...>)

当我添加这一行时:

#include "vector_helper.cpp"

int main() {...}之前,它编译得很好并且也有效。我该如何解决它,因为我想在g ++命令链接的文件中添加类特化。

1 个答案:

答案 0 :(得分:0)

这些模板类不能拆分成单独的目标文件,并且完全不专业化。如果您查看vector之类的标准模板,您会看到由于这个原因所有内容都在一个头文件中。

如果要隐藏模板的实现,则必须强制将它们实例化为一个或多个特定类型。你可以通过坚持像

这样的东西来做到这一点
template class helper<std::vector<int>>;
如果我没记错的话,在vector_helper.cpp结尾处

。但最好将所有模板保存在标题中。