Перегрузка класса 'operator [] в C ++ - PullRequest
4 голосов
/ 09 октября 2011

У меня есть класс, для которого я написал оператор [], и я хочу, чтобы иногда оператор возвращал int , а иногда struct .

Но компилятор не позволит мне перегрузить оператор, почему?

Там написано: «... не может быть перегружен»

Код:

template <class T> struct part
{ };


template <class T> class LinkedList
{
         public:
                LinkedList() : size(0), head(0) {}
                T& operator[](const int &loc);
                part<T>& operator[](const int &loc);
};

template <class T> T& LinkedList<T>::operator[](const int &loc)
{
         ..a lot of thing which compiles perfectly
}

template <class T> part<T>& LinkedList<T>::operator[](const int &loc)
{
         ...the same thing but returns struct&.
}

Ответы [ 2 ]

6 голосов
/ 09 октября 2011

Вы не можете перегрузить функцию в зависимости от типа возвращаемого значения. Вы могли бы попросить вашего оператора вернуть вариант int и string, и позволить пользователю проверить, что на самом деле было возвращено, но это громоздко. Если тип возвращаемого значения может быть определен во время компиляции, вы можете реализовать перегрузки операторов с помощью разных типов индексов. Примерно так:

struct as_string
{
    as_string( std::size_t index ) : _index( index ){}

    std::size_t const _index;
};

...

int operator[]( int index ) const { ... };
std::string operator[]( as_string const& index ) const { ... };

И тогда вызывающая сторона вызовет object[0] для получения результата int или object[as_string(0)] для получения результата string.

2 голосов
/ 09 октября 2011

Тип вывода функции не является частью сигнатуры функции. Таким образом, вы не можете использовать как int operator[](int index), так и Foo operator[](int index).

...