C++ частичная шаблонная специализация оператора потока
У меня есть класс Matrix с функцией друга для использования с оператором<<. Все это прекрасно работает, но теперь я хочу частично специализировать эту функцию-друга для работы по-другому, если класс Matrix имеет Matrix в качестве параметра шаблона (то есть, когда экземпляр класса объявлен как Matrix
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 ответа
Нет такой вещи, как частичная специализация шаблона функции.
Вам нужна перегрузка, а не специализация. Это должно скомпилировать, связать и запустить чисто (это для меня):
#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;
}
Если из-за этого вы получаете ошибки компилятора, возможно, у вас глючный компилятор.
Попробуйте написать специализацию явно:
template <>
friend std::ostream& operator<< <Matrix<char> >(std::ostream& output,
const Matrix<Matrix<char> >& other);