0

所以我对函数模板的部分专业化有疑问。我选择此处描述的解决方案:问题

现在我有这个:

#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);
}

但我想要这样的布局:

助手.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) { }
};

打印文件

#include "helper.hpp"

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

主文件

#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++ 命令链接的文件中添加类专业化。

4

1 回答 1

0

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

如果您想像这样隐藏模板的实现,则必须强制将它们实例化为一种或多种特定类型。您可以通过粘贴类似的东西来做到这一点

template class helper<std::vector<int>>;

最后vector_helper.cpp,如果我没记错的话。但是你最好将所有模板保存在标题中。

于 2012-11-08T18:23:09.643 回答