Как правильно перегрузиться <<оператор для ostream?

Я пишу небольшую матричную библиотеку в C++ для операций над матрицей. Однако мой компилятор жалуется, где, прежде чем он не сделал. Этот код оставили на полке в течение 6 месяцев и промежуточным, я обновил свой компьютер от травления debian до lenny (g ++ (Debian 4.3.2-1.1) 4.3.2) однако, у меня есть та же проблема в системе Ubuntu с тем же g ++.

Вот соответствующая часть моего матричного класса:

namespace Math
{
    class Matrix
    {
    public:

        [...]

        friend std::ostream& operator<< (std::ostream& stream, const Matrix& matrix);
    }
}

И "реализация":

using namespace Math;

std::ostream& Matrix::operator <<(std::ostream& stream, const Matrix& matrix) {

    [...]

}

Это - ошибка, данная компилятором:

матрица cpp:459: ошибка: 'станд.:: Математика ostream&:: Матрица:: оператор <<(станд.:: ostream&, Математика константы:: Matrix&)', должен взять точно один аргумент

Я немного смущен этой ошибкой, но с другой стороны мой C++ стал немного ржавым после выполнения большого количества Java те 6 месяцев.:-)

223
задан Agnel Kurian 24 August 2012 в 05:06
поделиться

3 ответа

Вы объявили свою функцию как friend. Это не член класса. Необходимо удалить Matrix:: из реализации. friend средства, что указанная функция (который не является членом класса) может получить доступ к переменным члена парламента, не занимающего официального поста. Путем Вы реализовали функцию, похож на метод экземпляра для Matrix класс, который является неправильным.

120
ответ дан Mehrdad Afshari 23 November 2019 в 03:59
поделиться

Просто говоря Вам о еще одной возможности: Мне нравится использовать друга определения для этого:

namespace Math
{
    class Matrix
    {
    public:

        [...]

        friend std::ostream& operator<< (std::ostream& stream, const Matrix& matrix) {
            [...]
        }
    };
}

функция будет автоматически предназначена в окружающее пространство имен Math (даже при том, что его определение появляется в рамках того класса), но не будет видимо, если Вы не называете operator< < с Матричным объектом, который заставит зависимый поиск аргумента найти то определение оператора. Это может иногда помогать с неоднозначными вызовами, так как это невидимо для типов аргумента кроме Матрицы. При записи его определения можно также обратиться непосредственно к именам, определенным в Матрице и к самой Матрице, не квалифицируя имя с некоторыми возможно длинный префикс и обеспечив шаблонные параметры как Math::Matrix<TypeA, N>.

134
ответ дан Johannes Schaub - litb 23 November 2019 в 03:59
поделиться

Добавить к ответу Mehrdad,

namespace Math
{
    class Matrix
    {
       public:

       [...]


    }   
    std::ostream& operator<< (std::ostream& stream, const Math::Matrix& matrix);
}

В Вашей реализации

std::ostream& operator<<(std::ostream& stream, 
                     const Math::Matrix& matrix) {
    matrix.print(stream); //assuming you define print for matrix 
    return stream;
 }
74
ответ дан kal 23 November 2019 в 03:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: