重载<<的部分模板特化操作者

时间:2013-09-15 18:17:06

标签: c++ template-specialization

我无法专门化一个重载的<<运营商模板:

一般模板定义如下:

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:非法使用显式模板参数”

有人可以告诉我我做错了吗?

1 个答案:

答案 0 :(得分:1)

我可能是错的,但在我的头脑中,我会说功能模板不能部分专业化。

即使他们可以,也更喜欢直接超载。

另见 Why Not Specialize Function Templates? (由Herb Sutter撰写)


查看 Live on Coliru

#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