C++で次のようなプログラムを書いて……
struct C { };
struct D : C { };
struct E : C { };
int main()
{
bool expr = true; // 実際にはexprの値を決めるごにょごにょが在る
C *p = expr ? new D() : new E();
return 0;
}
コンパイルすると……
>cl test.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
test.cpp
test.cpp(8) : error C2446: ':' : 'E *' 型から 'D *' 型への変換ができません。
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
こうなった。
えー、DもEもCの派生クラスだからC *に突っ込んで文句言われる筋合いはないぞー?とちょっと悩んだ。
よく考えたら、
expr ? new D() : new E()
この条件演算、結果の型は何やねん、という。条件が真の場合はD *で、偽の場合はE *?一つの式で結果の型が異なるとかそんなアホな。
結局、
C *p;
if(expr) p = new D();
else p = new E();
或いは、
C *p = expr ? static_cast<C *>(new D()) : static_cast<C *>(new E());
と書けと。
『派生先のポインタは派生元のポインタにキャスト無しで入れられる』という常識に気をとられて何も考えず書いた結果がこれだよ!反省。
- コンパイル
- 今回はVC++2010 Expressの
clを利用。
ラベル:C++

