const, шаблоны и приведение типов. Чего-то я не понимаю
От:
Аноним
Дата:
10.06.11 10:05
Оценка:
Есть шаблонный класс с вот таким методом (велосипед для работы с вектором):
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.
Дальше еще хлеще, правда уже сам шаблон не причем. Для данного класса есть перезагруженные методы + и *
и если есть что-то типа такого: a=b+c*d; выпадает в ступор и говорит что нет подходящего оператора присваивания. Если везде const, то проблем нету. Тут скорее всего вопрос почему компилятор, при вычислений выражение создает const-объект, хотя в перегруженном операторе ни одного упоминания const нету.
Re: const, шаблоны и приведение типов. Чего-то я не понимаю
Здравствуйте, Аноним, Вы писали:
А>Есть шаблонный класс с вот таким методом (велосипед для работы с вектором):
А>
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.
А>Дальше еще хлеще, правда уже сам шаблон не причем. Для данного класса есть перезагруженные методы + и *
А>и если есть что-то типа такого: 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+= кто будет определять?
Re[2]: const, шаблоны и приведение типов. Чего-то я не поним
цыфры являются константами, посему если принимать их по ссылке то по константной, метод 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+= кто будет определять?
Они есть, просто не стал выкладывать, но если надо:
Здравствуйте, Аноним, Вы писали:
А>Есть шаблонный класс с вот таким методом (велосипед для работы с вектором):
template<typename T> class AVector3D {
А>....
А>void set ( T &X, T &Y, T &Z) {array[1] = X; array[2] = Y; array[3] = Z;}
Зачем объявлять параметр ссылкой на неконстанту, если ты не собираешься его менять? А если ты собираешься его менять, то как ты собираешься менять значение 1.0? Или значение временного объекта, полученного преобразованием значения 1 к типу double?
Re: const, шаблоны и приведение типов. Чего-то я не понимаю
Здравствуйте, Аноним, Вы писали: А>Есть шаблонный класс с вот таким методом (велосипед для работы с вектором):
... А>и если есть что-то типа такого: a=b+c*d; выпадает в ступор и говорит что нет подходящего оператора присваивания. Если везде const, то проблем нету. Тут скорее всего вопрос почему компилятор, при вычислений выражение создает const-объект, хотя в перегруженном операторе ни одного упоминания const нету.
Прочитайте про перегрузку оператора умножения — если данный оператор является членом класса, то он не может принимать двух аргументов. Минимально причесанный работающий код: