Перегрузка оператора подстрочного индекса и ссылка на ошибку указателя

#c #overloading #operator-keyword #subscript

#c #перегрузка #operator-ключевое слово #нижний индекс

Вопрос:

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

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

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

Поскольку я впервые перегружаю этот оператор, я не совсем уверен в этом (особенно в части *amp; …)

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

 /// 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 foroperator[]’ in ‘img[0]’
./src/Graphics/Image.cc:24:12: note: candidate is: Color<P>*amp; Image<P>::operator[](const unsigned intamp;) [with P = double] <near match>
  

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

Есть идеи?

Спасибо!

Комментарии:

1. Имеет ли Color<P> перегруженный оператор[]?

2. Нет, почему у него должен быть один (я имею в виду, он мог бы индексировать компонент RGB, но, в частности, для этой проблемы)?

3. Какой компилятор вы используете? Пожалуйста, опубликуйте полный, краткий минимальный образец , который воспроизводит поведение.

Ответ №1:

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

Комментарии:

1. На самом деле я пробовал это, но поскольку это не соответствовало точной подписи, я попробовал это…

Ответ №2:

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

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

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

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