Что вызывает ошибку компилятора C ++: должен иметь аргумент класса или перечислимого типа? - PullRequest
9 голосов
/ 21 сентября 2011

Объявление функции:


template <typename T>
Point<T>* operator +(Point<T> const * const point, Vector<T> const * const vector);

Прошло много времени с тех пор, как я использовал C ++, поэтому, возможно, я делаю что-то действительно глупое. Дайте мне знать.

Кроме того, нет, я не использую стандартное пространство имен.

Ответы [ 3 ]

9 голосов
/ 21 сентября 2011

Что вы делаете неправильно на уровне языка, так это перегрузка операторов для указателей.По крайней мере, один аргумент перегруженного оператора должен иметь пользовательский тип или ссылку на него.

Но вы также делаете это неправильно на другом уровне.Вы возвращаете указатель, что означает, что вам, вероятно, потребуется динамически выделять некоторое хранилище в операторе.Ну, кому принадлежит это хранилище?Кто выпустит его?

Вам нужно просто взять ссылки и вернуть по значению, что-то вроде:

template <typename T>
Point<T> operator +(Point<T> const& point, Vector<T> const& vector) {
    return Point<T>(point.x + vector.x, point.y + vector.y);
}
4 голосов
/ 21 сентября 2011

Когда вы определяете оператор, по крайней мере один из аргументов должен быть пользовательским классом или перечислимым типом (или ссылкой на один из них). Указатели не соответствуют ни одному из них. Вы должны использовать ссылочные аргументы и возвращать неквалифицированную точку .

4 голосов
/ 21 сентября 2011

Вы не можете перегружать операторы для фундаментальных типов, в вашем случае оба аргумента являются указателями.Вы хотели ссылки вместо?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...