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

 
fxsaber:

1つは創られるだけです。さらに、fではTが 使えなくなります。

これ自体がエラーとなる。
template<typename T>
void f() { Print( sizeof( T )); }
struct A { int a; };
void OnStart()
{
        f<int>(); //(1)//нормально
        f<A>();   //(2)//нормально
struct B { int b; };
        f<B>();   //(3)//Error: 'B' - undeclared identifier
}
そして、(1)(2)と(3)の根本的な違いは何でしょう?
 
fxsaber:

さらに、fではTが使えなくなります。すべてにおいて、状況は一目瞭然です。

また、Tをfに使用することを禁止していることに違反します。

template<typename T>
void f() { class T; Print(__FUNCSIG__, ":" , sizeof(T)); }
template<typename T1, typename T2>
void g() { class T1 { T2 x; } a; f<T1>(); }
void OnStart()
{
class A {};
        g<A,int   >();
        g<A,double>();
}

ご覧のようにエラーなくコンパイルされますし、結果が不合理であっても、すべてが「説明可能」であれば、それは重要なことではありません。

 
みなさん、こんにちは。助けてください。ゴールドの取引ができない、全て機能しているのに、取引ができない。以下は、そのスクリーンショットです。
ファイル:
 

このコードの神聖な意味は何なのか、なぜ標準ライブラリ にまったく詰め込まなかったのか。

   if(IsStopped(__FUNCTION__))
      return(false);

標準ライブラリのポジションや注文を閉じる関数をOnDeaniteで使用することができなくなりました(例:REASON_REMOVE

 
Stanislav Dray:

このコードの神聖な意味は何なのか、なぜ標準ライブラリ にまったく詰め込まなかったのか。

OnDynit では、標準ライブラリのポジションや注文を閉じるための関数、例えば REASON_REMOVE を使用することができなくなりました。

はい、それはバグです。

 
A100:

さらに、Tをfに使用することを禁止したことに違反しました。

ご覧のように、エラーもなくコンパイルされ、結果が不合理であることは重要ではなく、すべてが「説明可能」であることが重要なのです。

テンプレートとは何か、よく分かっていないようですね。マクロと似ていますが、ある機能がついています。

以下はそのコードです。

template<typename T>
void f() { class T{ MqlTick a; }; Print(__FUNCSIG__, ":" , sizeof(T)); }
template<typename T1, typename T2>
void g() { class T1 { T2 x; } a; f<T1>(); }
void OnStart()
{
class A {};
        g<A,int   >();
        g<A,double>();
}

.

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

それは、Tがマクロのような設定であり、ある種の注意点があるだけだからです。最終的にあるのは、署名が作られるということです。関数内部では、Tに置き換えられるAについて誰も知らない。しかし、このAを内部で定義しているので、それ以上のコンパイルエラーは 発生しない。このAは他の同名のクラスとは関係ないことを示すために、中にMqlTickを挿入しました。

つまり、MQL5におけるイントラクラスは、親関数の外からは見えないようになっているのです。Tとして渡されるのはクラスとしての型名のみである。この場合、名前は親機能への参照を持ちません。

つまり、すべては極めて論理的に説明可能なのです。バグではなく、そういう限定的な実装なんです。


多分、面接でC++のプログラマーが「これは無理だ」と言うだろう。

template<typename T>
void f() { class T{}; }


MQL5も十分可能です。

 
fxsaber:

パターンというものをよく理解していないのでしょう。

fxsaber

ZS おそらく面接でC++のプログラマーが「これは無理だ」と言うでしょう。

もし、あなたがC++でこんなことは不可能だと思うのなら、それは私ではなく、テンプレートとは何か、どのように機能するかを理解していないあなたの方だということです...。杜撰な実装と制約のある実装を見分けるのは至難の業だ

 
A100:

C++でそんなことは不可能だと思うのなら、それは私ではなく、テンプレートとは何か、どのように機能するのかを理解していないということです...。凡庸な実装と境界のある実装を見分けることができないように、より一層

コメントをつけた文の最初の単語を読んでください。MQL5のテンプレートとマクロについて理解しているので、あなたの例がMQL5でコンパイルできないことは、コンパイルを試さなくても気づきます。C++「どうでしょう、それでは防げませんね。


このコードに対してC++がどのように反応するかを示していただけると幸いです。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

バグ、バグ、質問

fxsaber さん 2018.09.03 07:16

ZS おそらく面接でC++のプログラマーが「これは無理だ」と言うでしょう。

template<typename T>
void f() { class T{}; }
 
fxsaber:

このコードに対してC++がどのように反応するかを示してくれるとありがたいのですが。

反応はMQLと同じです。なぜ、違うのでしょうか?テンプレートはテンプレート
 
fxsaber:

テンプレートというものをよく理解していないのでしょう。そして、マクロと同じようなもので、いくつかのトリックがあるのみです。

はい、このサンプルはプラスでコンパイルされません

error: 'struct f()::T' の宣言が影となる template param template<typename T>.

が、仮にコンパイルできたとしても、クラス名が「T」になっているだけなので、その結果には驚かされるでしょう。

mqlで異なる場合、これは不正確です。