1

我无法专门化重载的 << 运算符模板:

通用模板定义如下:

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

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

4

1 回答 1

1

我可能是错的,但我会说函数模板不能部分专业化。

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

另请参阅为什么不专门化函数模板?(由赫伯萨特)


在 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
于 2013-09-15T18:47:51.177 回答