чего-то непонимаю в operator=
От: eric.av  
Дата: 11.10.06 05:06
Оценка:
Всем привет!
Есть такой класс:
template <class T>
class Nullable {
public:
  Nullable() ... { ...};
  Nullable(const T& other)... {...}
  
  operator Variant() const {...}
  operator T() {..}
  Nullable<T>& operator= ( Variant value ) {...}
  Nullable<T>& operator= (T value) {..}
  
  ...
};

и еще такой:
class Object{
public:
 Nullable<int> parentId;
 Nullable<String> name;
} ;

дальше так:
Object object;
Variant var;
const String DEF_STR = "abc";
String caption;
...
var = object->parentId; //работает Nullable<T>::operator Variant()
...
object->parentId = var; // (1) не работает: Cannot convert 'Variant' to 'Nullable<int>'

caption = ( ... ) ? DEF_STR : object->name; // (2) не работает: Two operands must evaluate to the same type

Вопрос: как сделать чтобы работало 1 и 2?
Спасибо.
Re: чего-то непонимаю в operator=
От: remark Россия http://www.1024cores.net/
Дата: 11.10.06 05:23
Оценка:
Здравствуйте, eric.av, Вы писали:

EA>дальше так:

EA>
EA>Object object;
EA>Variant var;
EA>const String DEF_STR = "abc";
EA>String caption;
EA>...
EA>var = object->parentId; //работает Nullable<T>::operator Variant()
EA>...
EA>object->parentId = var; // (1) не работает: Cannot convert 'Variant' to 'Nullable<int>'

EA>caption = ( ... ) ? DEF_STR : object->name; // (2) не работает: Two operands must evaluate to the same type  
EA>

EA>Вопрос: как сделать чтобы работало 1 и 2?
EA>Спасибо.


Не может работать и вариант, который работает
Что бы всё заработало замени "object->" на "object."
А так на msvc7.1 всё компилируется нормально.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: чего-то непонимаю в operator=
От: Аноним  
Дата: 11.10.06 05:35
Оценка:
Здравствуйте, remark, Вы писали:

R>Не может работать и вариант, который работает :)

R>Что бы всё заработало замени "object->" на "object." ;)
это я ошибся в записи Object object. На самом деле там Object* object...

Хотя если все в принципе правильно, то возможно это Borland'овские __property так немогут. Потому что на самом деле Object выглядит так:
class SomeObject : public TObject {
__property Nullable<int> parentId = { read = parentId_, write = parentId_ };
__property Nullable<AnsiString> name = { read = name_, write = name_ };
...
};
Думал что это должно быть прозрачно.
Re[2]: чего-то непонимаю в operator=
От: night beast СССР  
Дата: 11.10.06 05:52
Оценка:
Здравствуйте, remark, Вы писали:

EA>>дальше так:

EA>>
EA>>caption = ( ... ) ? DEF_STR : object->name; // (2) не работает: Two operands must evaluate to the same type  
EA>>

EA>>Вопрос: как сделать чтобы работало 1 и 2?
EA>>Спасибо.

R>Не может работать и вариант, который работает

R>Что бы всё заработало замени "object->" на "object."
R>А так на msvc7.1 всё компилируется нормально.

А не должно
во втором неоднозначность преобразования (возможно и к String и к Nullable<String>).
Re[3]: чего-то непонимаю в operator=
От: remark Россия http://www.1024cores.net/
Дата: 11.10.06 06:04
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, remark, Вы писали:


EA>>>дальше так:

EA>>>
EA>>>caption = ( ... ) ? DEF_STR : object->name; // (2) не работает: Two operands must evaluate to the same type  
EA>>>

EA>>>Вопрос: как сделать чтобы работало 1 и 2?
EA>>>Спасибо.

R>>Не может работать и вариант, который работает

R>>Что бы всё заработало замени "object->" на "object."
R>>А так на msvc7.1 всё компилируется нормально.

NB>А не должно

NB>во втором неоднозначность преобразования (возможно и к String и к Nullable<String>).

в абстрактном языке с++ iso/iec действительно не должно
однако язык с++ msvc7.1 это позволяет. хотя такие тонкие моменты они обычно не документируют, можно предположить, что преобразование третьего аргумента в тип второго имеет преимущество над преобразованием второго в тип третьего...



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: чего-то непонимаю в operator=
От: night beast СССР  
Дата: 11.10.06 06:16
Оценка:
Здравствуйте, remark, Вы писали:

NB>>А не должно

NB>>во втором неоднозначность преобразования (возможно и к String и к Nullable<String>).

R>в абстрактном языке с++ iso/iec действительно не должно

R>однако язык с++ msvc7.1 это позволяет. хотя такие тонкие моменты они обычно не документируют, можно предположить, что преобразование третьего аргумента в тип второго имеет преимущество над преобразованием второго в тип третьего...

ладно, скажем так язык с++ Comeau 4.3.8 на него ругается.
победить можно сделав конструктор explicit Nullable(const T& other); (надо при этом понимать последствия такого шага)

R>
Re[5]: чего-то непонимаю в operator=
От: remark Россия http://www.1024cores.net/
Дата: 11.10.06 06:26
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, remark, Вы писали:


NB>>>А не должно

NB>>>во втором неоднозначность преобразования (возможно и к String и к Nullable<String>).

R>>в абстрактном языке с++ iso/iec действительно не должно

R>>однако язык с++ msvc7.1 это позволяет. хотя такие тонкие моменты они обычно не документируют, можно предположить, что преобразование третьего аргумента в тип второго имеет преимущество над преобразованием второго в тип третьего...

NB>ладно, скажем так язык с++ Comeau 4.3.8 на него ругается.

NB>победить можно сделав конструктор explicit Nullable(const T& other); (надо при этом понимать последствия такого шага)

Или:

caption = ( ... ) ? DEF_STR : object->name.operator String();


R>>


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[6]: чего-то непонимаю в operator=
От: eric.av  
Дата: 11.10.06 06:43
Оценка:
Здравствуйте, remark, Вы писали:

R>
R>caption = ( ... ) ? DEF_STR : object->name.operator String();
R>


пока добавил метод
tempalte<class T> class Nullable {
 ...
 T value() { return value_; }
}
caption = ( ... ) ? DEF_STR : object->name.value();

не очень красиво.

NB>>во втором неоднозначность преобразования (возможно и к String и к Nullable<String>).

А что в инструкции A = (...) ? B : C; типы B и C не должны приводится к типу A? Просто не совсем понятно в чем смысл преодразования типа B в С или С в B.
Re[7]: чего-то непонимаю в operator=
От: night beast СССР  
Дата: 11.10.06 07:22
Оценка:
Здравствуйте, eric.av, Вы писали:

NB>>>во втором неоднозначность преобразования (возможно и к String и к Nullable<String>).

EA>А что в инструкции A = (...) ? B : C; типы B и C не должны приводится к типу A? Просто не совсем понятно в чем смысл преодразования типа B в С или С в B.

Конструкции (...) ? B : C нет.
есть конструкция (...) ? T : T. (то есть или B должно приводиться к С или С к B)
К чему потом будет приводиться T -- это уже второй вопрос.
Re: чего-то непонимаю в operator=
От: kaa_t Россия  
Дата: 11.10.06 07:29
Оценка:
Здравствуйте, eric.av, Вы писали:


template <class T>
class Nullable {
public:
  Nullable() ... { ...};
  Nullable(Variant value)... {...}   // кастинг делаем сдесь
  Nullable(const T& other)... {...}
  
  operator Variant() const {...}
  operator T() {..}
  // Nullable<T>& operator= ( Variant value ) {...} это все не нужно  оператор присвоения сделает компилятор  
  // Nullable<T>& operator= (T value) {..}         
  
  ...
};

caption = /* кастинг к String тут*/ ( ... ) ? /* Тут String */ DEF_STR : /* а сдесь Nullable<String> */object->name; 

caption = ( ... ) ? DEF_STR :  (String) object->name;  // правильно
Re[8]: чего-то непонимаю в operator=
От: remark Россия http://www.1024cores.net/
Дата: 11.10.06 08:06
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, eric.av, Вы писали:


NB>>>>во втором неоднозначность преобразования (возможно и к String и к Nullable<String>).

EA>>А что в инструкции A = (...) ? B : C; типы B и C не должны приводится к типу A? Просто не совсем понятно в чем смысл преодразования типа B в С или С в B.

NB>Конструкции (...) ? B : C нет.

NB>есть конструкция (...) ? T : T. (то есть или B должно приводиться к С или С к B)
NB>К чему потом будет приводиться T -- это уже второй вопрос.

Ещё можно добавить, что конструкции A = (...) ? T : T тоже нет. Т.е. full-expression вполне может быть просто вида:
С ? E1 : E2;

без всяких дальнейших преобразований и использований результата вычисления E1 (или E2).
Но даже тут E1 и E2 всё равно должны однозначно приводится к одному типу.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.