Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c++ > #11161
| Path | csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!gegeweb.org!de-l.enfer-du-nord.net!feeder2.enfer-du-nord.net!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail |
|---|---|
| From | "Bo Persson" <bop@gmb.dk> |
| Newsgroups | comp.lang.c++ |
| Subject | Re: Using the ternary operator to initialize derived class objects |
| Date | Mon, 31 Oct 2011 18:20:13 +0100 |
| Lines | 58 |
| Message-ID | <9h83mdFbjbU1@mid.individual.net> (permalink) |
| References | <5986ef71-bf1b-4c12-8d9b-8cb161ee1c42@f11g2000vbm.googlegroups.com> <c6a9207b-581f-4e65-b317-ccf2fbed6a9b@gk10g2000vbb.googlegroups.com> <91b4a224-7d87-4b81-85a6-ecbc2036cf18@q35g2000prh.googlegroups.com> |
| X-Trace | individual.net ClJe5ux6BD4zv8+ZKzfVwg3muIFttzYtDv8ce6SCNoDncX6m1+ |
| Cancel-Lock | sha1:p9DYqAIe3XSCZA2685Uos0NvNN4= |
| X-Priority | 3 |
| X-MSMail-Priority | Normal |
| X-Newsreader | Microsoft Outlook Express 6.00.2900.5931 |
| X-MimeOLE | Produced By Microsoft MimeOLE V6.00.2900.6109 |
| X-RFC2646 | Format=Flowed; Original |
| X-Antivirus | avast! (VPS 111031-0, 2011-10-31), Outbound message |
| X-Antivirus-Status | Clean |
| Xref | x330-a1.tempe.blueboxinc.net comp.lang.c++:11161 |
Show key headers only | View raw
Abhi wrote:
> On Oct 31, 10:40 am, Goran <goran.pu...@gmail.com> wrote:
>> On Oct 31, 1:35 am, Dwight Army of Champions
>>
>>
>>
>>
>>
>> <dwightarmyofchampi...@hotmail.com> wrote:
>>> Hello! Suppose I have two derived classes Car and Bicycle that
>>> derive from a base class Vehicle and an integer x. Why does the
>>> following code give an "operand types are incompatible" error...
>>
>>> Vehicle* AnyVehicle = (x % 2 == 0) ? new Car() : new Bicycle();
>>
>>> ...but the following code, which utilizes a simple if statement
>>> to do exactly the same thing, compiles successfully?
>>
>>> Vehicle* AnyVehicle;
>>
>>> if (x % 2 == 0) {
>>> AnyVehicle = new Car();}
>>
>>> else {
>>> AnyVehicle = new Bicycle();
>>
>>> }
>>
>>> Is it even possible to initialize these objects with the ternary
>>> operator?
>>
>> The problem is, in "left : right" part of the ternary, you have two
>> unrelated types as far as the compiler is concerned. It tries to
>> deduct a type for that part, and does not try upcasting (note that
>> upcasting can get pretty messy if attempted on a more complicated
>> derivation case). You can use static_cast<Vehicle*> on any side to
>> work-around. The fact that you have Vehicle on the left does not
>> matter, as usual conversion rules are being applied on the "="
>> boundary, so the right side of "=" is done in on it's own.
>>
>> Goran.
>
>
> Could you please explain it in bit more detail. I m still confused
> :(
>
> Abhishek
The compiler has to figure out the resulting type of the ternary
expression. That works fine if the two subexpressions are of the same
type, or one is convertible to the other.
That they are both convertible to a third type doesn't help.
Bo Persson
Back to comp.lang.c++ | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Using the ternary operator to initialize derived class objects Dwight Army of Champions <dwightarmyofchampions@hotmail.com> - 2011-10-30 17:35 -0700
Re: Using the ternary operator to initialize derived class objects Goran <goran.pusic@gmail.com> - 2011-10-30 22:40 -0700
Re: Using the ternary operator to initialize derived class objects Abhi <meetabhi31@gmail.com> - 2011-10-31 07:17 -0700
Re: Using the ternary operator to initialize derived class objects "Bo Persson" <bop@gmb.dk> - 2011-10-31 18:20 +0100
Re: Using the ternary operator to initialize derived class objects Richard Damon <news.x.richarddamon@xoxy.net> - 2011-10-31 13:19 -0400
csiph-web