流操作符的C ++部分模板特化

时间:2011-10-22 14:54:36

标签: c++ template-specialization ostream friend-function

我有一个带有友元函数的Matrix类,可以与运算符<<一起使用。这一切都运行正常但我现在想要部分专门化该友元函数以不同的方式工作,如果Matrix类具有Matrix作为其模板参数(即,当类的实例已被声明为Matrix< Matrix< char>>)时。在课程定义中我首先有

template <typename U>
friend std::ostream& operator<<(std::ostream& output, const Matrix<U>& other);

我尝试添加

friend std::ostream& operator<<(std::ostream& output, const Matrix<Matrix<char> >& other);

但这给了我编译器的多个声明错误。 我似乎无法弄清楚如何实现这一目标。

2 个答案:

答案 0 :(得分:1)

<强> There's no such thing as a partial specialization of a function template

您需要重载,而不是专业化。这应该编译,链接和运行干净(它对我来说):

#include <iostream>

template <typename T>
class Matrix {
  public:
    template <typename U> friend std::ostream& 
        operator<<(std::ostream& output, const Matrix<U>& other);
    friend std::ostream& 
        operator<<(std::ostream& output, const Matrix<Matrix<char> >& other);    
};


template <typename U>
std::ostream& 
operator<<(std::ostream& output, const Matrix<U>& other)
{
    output << "generic\n";
    return output;
}

std::ostream& 
operator<<(std::ostream& output, const Matrix<Matrix<char> >& other)
{
    output << "overloaded\n";
    return output;
}

int main ()
{
    Matrix<int> a;
    std::cout << a;

    Matrix<Matrix<char> > b;
    std::cout << b;
}

如果你从这里得到编译器错误,你可能有一个错误的编译器。

答案 1 :(得分:0)

尝试明确编写专业化:

template <>
friend std::ostream& operator<< <Matrix<char> >(std::ostream& output,
                                       const Matrix<Matrix<char> >& other);