#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 for ‘operator[]’ 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
, что, вероятно, было не так, как должен был использоваться класс.