operator T() или operator T() const
От: Libra Россия  
Дата: 21.04.03 09:25
Оценка:
Здравствуйте всем...
У меня проблема следующего плана...
Есть некий код, который компиляется под MSVC6.0 SP5 и BCB6.0 и вроде правильно работает...
template<class _Ty> class B
{
  private : 
            _Ty res;
  public  :
            B() : res() {}
            B(const _Ty &_v) : res(_v) {}
            operator _Ty() const { return _Ty(res); }
};
void foo(const B<long> &_val)
{
  long tst = _val;
  if(_val == 100)
   {
     int zzz = 0;
   }
}
int main(void)
{
  B<long> test0;
  if(test0 == 0)
   {
     int zzz = 0;
   }
  foo(test0);
  return 0;
}

но у меня есть некоторые сомнения по поводу операторов явного преобразования. Что-то мне подсказывает что тут есть какие-то грабли.
Если при компиляции MSVC-ёй в класс B добавить реализацию оператора преобразования для неконстантного объекта
template<class _Ty> class B
{
  private : 
            _Ty res;
  public  :
            B() : res() {}
            B(const _Ty &_v) : res(_v) {}
            operator _Ty() { return _Ty(res); }
            operator _Ty() const { return _Ty(res); }
};

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

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

в момент сравнения в функции foo() и в функции main()
В чем проблема?
По моему все нормально, в одном случае должен быть вызван оператор преобразования для константного объекта в другом для неконстантного...
Если попытаться поэкспериментировать дальше то там уже оба копиллера отдыхают по полной программе, то неоднозначность, то оператор сравнения не определен...
И еще.... Только что родился еще один вопрос, по этой же теме
Разве это не одно и то же?
 template<class _Ty>
 class B
 {
//.....
   operator _Ty() const { return _Ty(res); }
   operator const _Ty() const { return _Ty(res); }
//.....
 };
Species come and go, but the earth stands forever fast...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.