Re: const, шаблоны и приведение типов. Чего-то я не понимаю
От: _niko_ Россия  
Дата: 10.06.11 10:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть шаблонный класс с вот таким методом (велосипед для работы с вектором):


А>
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+= кто будет определять?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.