我无法专门化一个重载的<<运营商模板:
一般模板定义如下:
template<typename DocIdType,typename DocType>
std::ostream & operator << (std::ostream & os,
const Document<DocIdType,DocType> & doc)
{
[...]
}
通用模板工作正常。现在我想专门化第二个模板参数。我试过了:
template<typename DocIdType>
std::ostream & operator << <DocIdType,std::string> (std::ostream & os,
const Document<DocIdType,std::string> & doc)
{
[...]
}
当我尝试编译这段代码时,我得到以下编译器错误: “C2768:非法使用显式模板参数”
有人可以告诉我我做错了吗?
答案 0 :(得分:1)
我可能是错的,但在我的头脑中,我会说功能模板不能部分专业化。
即使他们可以,也更喜欢直接超载。
另见 Why Not Specialize Function Templates? (由Herb Sutter撰写)
#include <iostream>
#include <string>
template<typename DocIdType,typename DocType>
struct Document {};
template<typename DocIdType>
std::ostream & operator << (std::ostream & os, const Document<DocIdType,std::string> & doc) {
return os << "for string";
}
template<typename DocIdType,typename DocType>
std::ostream & operator << (std::ostream & os, const Document<DocIdType,DocType> & doc) {
return os << "for generic";
}
using namespace std;
int main(int argc, char *argv[])
{
std::cout << Document<struct anything, std::string>() << "\n";
std::cout << Document<struct anything, struct anything_else>() << "\n";
}
打印
for string
for generic