0

我有一个 Matrix 类,它有一个与 operator<< 一起使用的友元函数。这一切都很好,但是如果 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);

但这给了我来自编译器的多个声明错误。我似乎无法弄清楚如何做到这一点。

4

2 回答 2

1

没有函数模板的部分特化之类的东西

你需要重载,而不是专业化。这应该可以干净地编译、链接和运行(它对我有用):

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

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

于 2011-10-22T15:23:33.190 回答
0

尝试明确编写专业化:

template <>
friend std::ostream& operator<< <Matrix<char> >(std::ostream& output,
                                       const Matrix<Matrix<char> >& other);
于 2011-10-22T15:03:42.167 回答