Здравствуйте, Аноним, Вы писали:
А>Есть шаблонный класс с вот таким методом (велосипед для работы с вектором):
А>template<typename T> class AVector3D {
А>....
А>void set ( T &X, T &Y, T &Z) {array[1] = X; array[2] = Y; array[3] = Z;}
А>
А>есть вот такой тестовый пример:
А>А> AVector3D<double> a, q, r;
А> double b=3.14;
А> q.set(1.0, 1.0, 1.0);
А> r.set(1,1,1);
А>
А>На последнюю строчку ругается как и на предпоследнюю: нет такого метода, который он мог бы вызвать.
А>Если в объявлении метода поставить const то все компилируется и работает. Хотелось бы понять, что тут не так. Ах да, компилятор — gcc 4.4.5.
А>Дальше еще хлеще, правда уже сам шаблон не причем. Для данного класса есть перезагруженные методы + и *
А>А> //Умножение скаляра на вектор
А> template<typename T> inline AVector3D<T> operator* (T &val, AVector3D<T> &v) {
А> AVector3D<T> tempVec = v;
А> return tempVec *= val;
А> }
А> //Сложение векторов
А> template<typename T> inline AVector3D<T> operator+ (AVector3D<T> &v1, AVector3D<T> &v2) {
А> AVector3D<T> tempVec = v1;
А> return tempVec += v2;
А> }
А>
А>и если есть что-то типа такого: a=b+c*d; выпадает в ступор и говорит что нет подходящего оператора присваивания. Если везде const, то проблем нету. Тут скорее всего вопрос почему компилятор, при вычислений выражение создает const-объект, хотя в перегруженном операторе ни одного упоминания const нету.
В строке
q.set(1.0, 1.0, 1.0);
цыфры являются константами, посему если принимать их по ссылке то по константной, метод
set нада подкорректировать:
// Или так
set( T const & X, T const & Y, const & Z) {array[1] = X; array[2] = Y; array[3] = Z;}
// Или так
set( T X, T Y, Z) {array[1] = X; array[2] = Y; array[3] = Z;}
А по 2-у пункту:
Операторы
operator* и
operator+ то ты определил, а
operator*= и
operator+= кто будет определять?