Есть шаблонный класс с вот таким методом (велосипед для работы с вектором):
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 нету.