0

operator<< で使用するフレンド関数を持つ 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);

しかし、これにより、コンパイラから複数の宣言エラーが発生しました。これを達成する方法がわかりません。

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 に答える