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

 
fxsaber:

そのとおりです。これで、あらゆる種類の関数や変数を一度に呼び出すことができるようになりました。このような曖昧さには、偶発的なエラーを引き起こさないような常識が必要 です。私見では、誤って別のfを拾って定義したときに問題が発生するくらいなら、typename fに空文字列を発行して誤魔化すのが論理的だと思います。

どこの国でも、特にバグの中で頑なに常識を探すのはやめましょう。あなたの話を聞けば、MQLのどんなバグも、まったくバグではなく、賢明な開発者が盛り込んだ機能なのです ))。

すでに述べたように、疑問があれば、まずC++で確認し、解決策を考えることです。

曖昧さについては、コンパイラのエラーになり、問題はないはずです。サンプルA100では、すべてがクリアで曖昧さがなかったので、意味がよくわからないのですが。関数をオーバーロードする必要があればオーバーロードし、曖昧な部分のコンパイル エラーを修正すればそれで終わりです。

 

MQLでテンプレートクラスの静的メンバを 初期化する方法を教えてください。

template<typename T>
class xxx
{
  static int value;
};

template <typename T>
int xxx<T>::value = -1;
 
Stanislav Korotky:

MQLでテンプレートクラスの静的メンバを 初期化する方法を教えてください。

ストレートな問題であれば、テンプレートではないベースとなるクラスに持ってきて、それを継承する。一般的にはどうなんだろう。
 
Stanislav Korotky:

MQLでテンプレートクラスの静的メンバを 初期化する方法を教えてください。

template <typename T>
int xxx::value = -1;
 

A100:

template <typename T>
int xxx::value = -1;

一般的には、もちろんC++には対応しない方法ですが、MQLでは有効です。

クラス外のメソッドで同様の問題が発生しました。

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

template<typename T>
void A<T>::f() { }  //'A' - identifier already used

おかげさまで解決しました。

template<typename T>
void A::f() { }
もちろんこれも間違いですが、これはテンプレートクラスのメソッドではなく、テンプレートメソッドを定義することを意味するからです。また、クラスが両方を含んでいる場合、曖昧さが生じます
 
Alexey Navoykov:

クラス外のメソッドを取る際にも、同じような問題がありました。

この方がずっと便利なんです。唯一の制限は、間に別のクラス(例のように)を挟むことができないことです。

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

エラー、バグ、質問

A100, 2016.05.19 23:26

コンパイルエラー

template<typename T>
class A { public:
        bool operator==( const A& ); //error: 'operator' - function must have a body
        T t;
};
class B {
        A<int> a;
};
template<typename T>
bool A::operator==( const A& )  { return false; }
void OnStart()
{
        A<int> a, b;
        Print( a == b );
}
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2016.05.19
  • www.mql5.com
Форум алго-трейдеров MQL5
 
Alexey Navoykov:

というのも、これはテンプレートクラスのメソッドではなく、テンプレートのメソッドを定義することを意味するからです。また、クラスに両方が含まれる場合は、曖昧さが生じます

曖昧さはなく、全ては私たちの前に考えられている(c)。テンプレートの行を2回繰り返す必要があります (上の行はクラス、下の行はメソッドを参照します)
 
A100:
それはない。すべて私たちの前に考えられているのだから(C)。テンプレート行を2回繰り返す必要があります (上の行はクラス、下の行はメソッドを参照します)。

これ、めっちゃくちゃヤバくない?

A100:
その方がずっと便利です。

うん、まあ、<T>をつけなくていいというのは、それだけ重大な利便性なんだけどね(笑)。

 
Alexey Navoykov:

ああ、<T>を付けなくていいってのは、それだけ重大な利便性なんだな(笑)。

クラスの外にメソッドを置けるのは便利という意味です
 
Alexey Navoykov:

クラス外のメソッドを取る際にも、同じような問題がありました。

もちろん、これはテンプレートクラスのメソッドではなく、テンプレートメソッドを定義することを意味するので、間違っています。また、クラスに両方が含まれる場合は、曖昧さが生じます。

メソッドがクラスの外に置かれることが多いことに気づきましたが、なぜでしょうか?SBに目を通したところ、「小さい」メソッドは1行で一気に、「長い」メソッドはクラスの外で定義されているんですね。外部定義におけるALT+Gは1つではなく、2つのトランジションポイントを提供するため、知覚の利便性はありません。また、過負荷がある場合は、それぞれ2の倍数とする。ALT+Mでもう全部一度に表示されるし。

もしかしたら、これはインターフェース定義のわかりやすさに対するある種の賛辞なのかもしれませんが、今のところ、私はそこに踏み込んでいません。