Просто расскажу вам о другой возможности: мне нравится использовать определения друзей для этого:
namespace Math
{
class Matrix
{
public:
[...]
friend std::ostream& operator<< (std::ostream& stream, const Matrix& matrix) {
[...]
}
};
}
Функция будет автоматически нацелена на окружающее пространство имен Math
(хотя его определение появляется в пределах объем этого класса), но не будет отображаться, если вы не вызываете оператор & lt; & lt; с объектом Matrix, который заставит зависящий от аргумента поиск найти это определение оператора. Иногда это может помочь с неоднозначными вызовами, поскольку оно невидимо для типов аргументов, отличных от Matrix. При написании своего определения вы также можете ссылаться непосредственно на имена, определенные в матрице и на матрицу, без определения имени с некоторым возможным длинным префиксом и предоставления параметров шаблона, таких как Math::Matrix<TypeA, N>
.