Re: operator T() или operator T() const
От: Cadoon  
Дата: 21.04.03 10:53
Оценка: -1
Здравствуйте, Libra, Вы писали:

L>Если при компиляции MSVC-ёй в класс B добавить реализацию оператора преобразования для неконстантного объекта

L>
L>template<class _Ty> class B
L>{
L>  private : 
L>            _Ty res;
L>  public  :
L>            B() : res() {}
L>            B(const _Ty &_v) : res(_v) {}
L>            operator _Ty() { return _Ty(res); }
L>            operator _Ty() const { return _Ty(res); }
L>};
L>

L>то код по прежнему нормально воспринимается компилятором и все операции сравнения и присваивания работают правильно, но если это попытаться откомпилять в BCB6.0 то начинаются ошибки
L>

L>[C++ Error] Unit1.cpp(15): E2015 Ambiguity between 'B<long>::operator long()' and 'B<long>::operator long() const'
L>[C++ Error] Unit1.cpp(24): E2015 Ambiguity between 'B<long>::operator long()' and 'B<long>::operator long() const'

L>в момент сравнения в функции foo() и в функции main()
L>В чем проблема?

первый оператор не может менять данные объекта класса B (т.е. является константным), второй может.

L>И еще.... Только что родился еще один вопрос, по этой же теме

L>Разве это не одно и то же?
L>
L> template<class _Ty>
L> class B
L> {
L>//.....
L>   operator _Ty() const { return _Ty(res); }
L>   operator const _Ty() const { return _Ty(res); }
L>//.....
L> };
L>


Нет, в первом случае константный оператор (не может изменять данные объекта), во втором помимо этого и результат является константой, т.е. полученный объект изменять нельзя (можно получать данные и вызывать константные функции).

B<long> b;

long l = d; //используется первый оператор
const long cl = b; //используется второй оператор
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.