Определение оператора << Внутри класса

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

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 ответа

Решение

У тебя есть

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

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

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

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

,

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

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

class MyClass
{
    template <typename Datatype>
    friend MyClass& operator<<(MyClass& MyClassReference, Datatype SomeData) 
    {
        // ...
    }
};
Другие вопросы по тегам