Определение оператора << Внутри класса - PullRequest
0 голосов
/ 03 марта 2011

Рассмотрим следующий код:

class MyClass
{
    template <typename Datatype>
    friend MyClass& operator<<(MyClass& MyClassReference, Datatype SomeData);
    // ...
};

template <typename Datatype>
MyClass& operator<<(MyClass& MyClassReference, Datatype SomeData)
{
    // ...
}

Как я могу определить operator<< внутри класса, а не как функцию друга? Примерно так:

class MyClass
{
    // ...

    public:

    template <typename Datatype>
    MyCLass& operator<<(MyClass& MyClassReference, Datatype SomeData)
    {
        // ...
    }
};

Приведенный выше код вызывает ошибки компиляции, поскольку он принимает два аргумента. Удаление аргумента MyClassReference исправляет ошибки, но у меня есть код, который опирается на этот аргумент. Является ли MyClassReference просто эквивалентом *this?

Ответы [ 3 ]

1 голос
/ 03 марта 2011

Я не уверен, что это хорошая идея, но да - когда вы определяете operator<< как функцию-член, *this будет по существу эквивалентен первому параметру, который вы определили в своем операторе.

1 голос
/ 03 марта 2011

У вас есть

template <typename Datatype> MyClass& operator<<(MyClass& MyClassReference, Datatype SomeData);

внутри класса.Это метод класса MyClass.Нестатические методы имеют неявный параметр, называемый указателем this.Указатель this - это указатель на объект, для которого был вызван метод.Вам не нужен параметр MyClassReference, потому что указатель this выполняет эту цель.

Измените объявление этого метода на

template <typename Datatype> MyClass& operator<<(Datatype SomeData);

.

0 голосов
/ 08 сентября 2017

Вы были почти там:

class MyClass
{
    template <typename Datatype>
    friend MyClass& operator<<(MyClass& MyClassReference, Datatype SomeData) 
    {
        // ...
    }
};
...