所以我遇到了功能模板部分特化的问题。我选择此处描述的解决方案: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 ++命令链接的文件中添加类特化。
答案 0 :(得分:0)
这些模板类不能拆分成单独的目标文件,并且完全不专业化。如果您查看vector
之类的标准模板,您会看到由于这个原因所有内容都在一个头文件中。
如果要隐藏模板的实现,则必须强制将它们实例化为一个或多个特定类型。你可以通过坚持像
这样的东西来做到这一点template class helper<std::vector<int>>;
如果我没记错的话,在vector_helper.cpp
结尾处。但最好将所有模板保存在标题中。