template<typename T> void F(T)
{
class A
{
void f() { new A; } // 'A' - declaration without typevoid g() { A* a; } // 'A' - pointer to this function type is not supported yet
};
};
voidOnStart()
{
F(0);
}
class A
{
};
class B : protected A
{
};
voidOnStart()
{
A* a;
B* b= (B*)a; // conversion from 'B *' to 'A *' is not accessible because of inheritance access
}
コンパイルエラーです。
ここで、さらにいくつかの失敗を紹介します。
あと、ポインターの変換もおかしい。
以下のコードはコンパイルできません。
が、ここでは変換が明示されています。全てはC++で動く。
あと、道しるべを持ち込むのも何かメチャクチャですね。
そうなんです、コンパイラが戦っているんです。
dynamic_cast、static_cast、reinterpret_castについて、また、それらを正しく使うべき場合とそうでない場合について読んできてください。
C++はこのコードをreinterpret_castに、MQLはdynamic_castに変換します。また、私の理解では、コンパイラがコンパイル時にダイナミックキャストエラーを発見できるのは、まさにこの場合です。
reinterpret_castはこの場合非合法なので、このコードがC++でコンパイルされることは論外です。
C++はこのコードをreinterpret_castに、MQLはdynamic_castに変換します。また、私の理解では、コンパイラがコンパイル時にダイナミックキャストエラーを発見できるのは、まさにこの場合です。
この場合、Reinterpret_castは非合法なので、このコードがC++でコンパイルされるという事実は論拠になりません。
ダイナミックキャストと何の関係があるんだ? コンパイラの仕事は、シャーロック・ホームズになってプログラムロジックの中から何かを探し出すことではない。 言語規格に準拠しているかどうかを形式的にチェックするだけだ。 そして規格から見ればすべて正しいのだ。
私のサンプルをよく見ていただければ、protectedに関する問題であることがおわかりいただけたと思います。 publicに変更すれば、すべてOKです。つまり、MQLコンパイラに不要な制約があるだけなのです。
ですから、憶測で何もないところに秘密の意味を探したりしないでください。これは単なる些細なコンパイラのエラーに過ぎません。