C ++ частичная шаблонная специализация оператора потока - PullRequest
0 голосов
/ 22 октября 2011

У меня есть класс Matrix с функцией Friend для использования с оператором <<.Все это прекрасно работает, но теперь я хочу частично специализировать эту функцию-друга, чтобы она работала по-другому, если класс 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 ]

1 голос
/ 22 октября 2011

Нет такой вещи, как частичная специализация шаблона функции .

Вам нужна перегрузка, а не специализация.Это должно скомпилировать, связать и запустить чисто (это для меня):

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

Если вы получаете ошибки компилятора из-за этого, возможно, у вас глючный компилятор.

0 голосов
/ 22 октября 2011

Попробуйте написать специализацию явно:

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