Перегрузка оператора индекса и ссылка на ошибку указателя - PullRequest
0 голосов
/ 04 ноября 2011

Я некоторое время борюсь со странной ошибкой, и мне нужна ваша помощь: D

У меня есть класс 'Image', объявленный как

template <typename P>
class Image {
// ...
public: // Operators 
    Color<P>*& operator [] ( unsigned int const& i );
// ...
}

Так как это первыйКогда я перезагружаю этот оператор, я не совсем уверен в этом (особенно в * & part ...)

Проблема появляется, когда я пытался что-то вроде:

/// Sample Code
Image<P> img; img[0][0] = Color<double>(1.0, 1.0, 1.0);

Я получаю

./src/Graphics/PNGWriter.cc:12:3: error: no match for ‘operator[]’ in ‘img[0]’
./src/Graphics/Image.cc:24:12: note: candidate is: Color<P>*& Image<P>::operator[](const unsigned int&) [with P = double] <near match>

Очевидно, что решение для меня немного сложнее ...

Есть идеи?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 ноября 2011

Прежде всего, нет необходимости передавать столько вещей по ссылке. Принятие unsigned int по значению почти наверняка не замедлит процесс; То же самое касается ссылки на указатель.

Это может быть проблемой, но я сомневаюсь в этом; Я не понимаю, почему 0 не конвертируется в unsigned int const&. Другая возможность состоит в том, что изображение на самом деле const, но вы не упомянули об этом в своей пасте. Подстрочные операторы обычно идут парами; вам нужно объявить еще один как Color<P> const* operator [] ( unsigned int i ) const;.

Обратите внимание, что img[0] - это то, на что жаловались, так что = Color<double>(1.0, 1.0, 1.0);, вероятно, не проблема (если только я не пропустил ошибку SFINAE). Наконец, убедитесь, что вы не специализировали Image для double.

РЕДАКТИРОВАТЬ: Кстати, возвращение Color<P>*& имеет серьезный недостаток; кто-то может сделать img[0] = 0, что, вероятно, было не так, как предполагалось использовать класс.

0 голосов
/ 04 ноября 2011

Все ошибки "нет соответствия для" ... "означают, что аргументы в вызове не совместимы с объявленными аргументами для каких-либо функций или операторов, поэтому вам следует обратиться к объявлениям аргументов.Аргумент operator[] без знака int.Аналогично, передача возвращенного указателя по ссылке довольно странная;не обязательно плохо, но очень подозрительно.Как правило, несоставные типы должны передаваться по значению.

...