エラー、バグ、質問 - ページ 2271

 
A100:
コンパイルエラーです。

(1)(2)と(3)(4)の根本的な違いは何でしょうか。

関数の外でクラス(3)(4)を宣言しても、エラーは発生しません。関数内で宣言すると、エラーが発生します。

 
Vladimir Pastushak:

次のような行動は、何に関連するのでしょうか。

コンパイルしたインジケータは正常に動作し、再度コンパイルしたインジケータは正常に動作しない。テスターで正常に動作するか?

どの指標?

 
fxsaber:

ここで、C++は何を生み出す のでしょうか?

MQL5で動作させるためには、出力に同じ文字列ではなく、2つの異なる文字列が必要です。でも、それならサイン形成のメカニズムも絶対に違うはずです。C++が printで同じ結果を出 せば、__FUNCSIG__のコストは劇的に下がります。

結果: C++

void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )

ご覧の通り、弦が違う...。関数シグネチャが使用される

 
A100:

結果: C++

void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )

ご覧の通り、弦が違う...。関数シグネチャが使用される

MQL5が出る。

void f<A>(A&)

つまり、関数の内部にクラス・シグネチャが存在しない。いつかは対応する。


また、クラスがグローバルである場合、C++はどの行を生成するのでしょうか?

void f<::A>( ::A& )

void f<A>( A& )

 
fxsaber:

MQL5が配布する

つまり、関数の内部にクラス・シグネチャが存在しないのです。いつかは対応する。

旧式のC++コンパイラがサポートしていない場合、すでにソース コードの1行目(1)でエラーになります。そもそも、なぜある場合はエラーになり、別の場合は正常なエラーになるのか、という疑問がこのような形で投げかけられたわけです。

どちらの場合も、エラーになるか、エラーにならないか、同じ動作をすると思っていました。そして、エラーは、サポートの欠如それ自体にあるのではなく、他の平等な条件下での不平等な行動(この例の ように)にあります。

 
fxsaber:
また、クラスがグローバルである場合、C++はどの行を生成するのでしょうか?

void f<::A>( ::A& )

void f<A>( A& )

第2バリアント

 
A100:

旧式のC++コンパイラがこれをサポートしていない場合、すでにソース コードの1行目(1)でエラーになります。そもそも、なぜある場合はエラーになり、別の場合は正常なエラーになるのか、という疑問がこのような形で投げかけられたわけです。

どちらの場合も、エラーになるか、エラーにならないか、同じ動作をすると思っていました。そして、エラーは、サポートの欠如それ自体ではなく、他のすべてが同じである(この例の ように)不平等な動作にあります。

まあ、説明するのは簡単なんですけどね。コンパイラは、コードを上から下へと走査し、対応するシグネチャを形成しながら進めていく。最初の署名は問題なく作成されます。2枚目に至っては、すでにそのような署名があるのです。ここでは、2行目でエラーになっています。

 
Georgiy Merts:

クラス(3)(4)を関数外で宣言しても、エラーは発生しません。関数の中で宣言すると-エラーが発生します。

もし、最初の例で
        class  A2 { int i; }; //(3)

置き換える

        interface  A2 {};      //(5)

関数の中で宣言してもエラーにならないのですが、根本的な違いは何でしょうか?

 
fxsaber:

だから、理解できるのです。コンパイラはコードの上から下へと進み、適切なシグネチャを形成しながら進めていく。最初の署名は問題なく作成されます。2枚目まで来て、すでに1枚持っている。したがって、2行目でエラーになります。

では、なぜMQLでエラーなくコンパイルできるのでしょうか?

template<typename T>
void f() { Print(__FUNCSIG__); }
void g1() { class A { int    x; } a; f<A>(); }
void g2() { class A { double x; } a; f<A>(); }
void OnStart()
{
        g1();
        g2();
}

結果:MQL C++

void f<A>() void f<g1::A>()
void f<A>() void f<g2::A>()

なぜ、ここで何の干渉も受けずに署名が作成されるのか?

 
A100:

では、なぜMQLでエラーなくコンパイルできるのでしょうか?

結果:MQL C++

void f<A>() void f<g1::A>()
void f<A>() void f<g2::A>()

なぜ、ここで何の干渉も受けずに署名が作成されるのか?

1つは創られるだけです。さらに、fではTを使うことができません。とにかく、状況は一目瞭然なのです。