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

 
Internal compiler error」はどのような場合に発生するのでしょうか?  
イリヤス
これまでに2件の事例を知っています。
1) bool &=演算(bool 式)において
2)初期化シーケンス に不要なカンマ: val={ {...},{...},}.

これらのバグは新しいビルドではまだ修正されていないのでしょうか? 私のコンパイラはまだエラーを発生させるので、1159ビルドにこだわらざるを得ないのです。

 
Renat Fatkhullin:
テンプレートの要件は、すべてのメソッドをクラス記述の内部に配置し、ボディを外部に配置しないことです。

スタックとキューコンテナを作成し、1ヶ月後にはクラステンプレートが登場し、すべてがうまく機能するようになりました。)

もう一つの質問は、クラステンプレートについてです。2つのテンプレートクラスがあり、一方のクラスがもう一方のクラスを使用している場合、一方のテンプレートクラスから他方のテンプレートクラスへの型の移行はあるのでしょうか、ないのでしょうか?

 
coderex:

スタックとキューコンテナを作成し、1ヶ月後にはクラステンプレートが登場し、すべてがうまく機能するようになりました。)

もう一つの質問は、クラステンプレートについてです。2つのテンプレートクラスがあり、一方のクラスがもう一方のクラスを使用している場合、一方のテンプレートクラスから他方のテンプレートクラスへの型の移行はあるのでしょうか、ないのでしょうか?

試してみてください。
 
Renat Fatkhullin:
試してみてください。
試してみると何度かエラーが出るので、別の方法を考える...。
 

Ilyas:
На сегодня известно о двух случаях:
1) в операции bool &= (bool expression)
2) Лишняя запятая в инициализирующих последовательностях: val={ {...},{...}, }

アレクセイ・ナヴォイコフ
これらのバグは新しいビルドではまだ修正されていないのでしょうか? 私のコンパイラはまだエラーを出し、1159ビルドのままでなければなりません。

念のため、MT4 890でp.2に余分なカンマがあることを確認しましたが、エラーメッセージが 表示されるだけでした。
 

CListの ソーティングをされた方はいらっしゃいますか?

基本的にはCompareをオーバーライドする必要があります。

でも、いつもベースクラスのCompareを呼んでいます。でも、うまくいかない、何が悪いんだろう...。

簡単な例を作ってみました。

class COperation : public CObject
  {
public:
   double           number;
   COperation(double p) { number = p;}

virtual int Compare(const CObject *node,const int mode=0);
  };
  
 int COperation::Compare(const CObject *node,const int mode=0)
  {
   const COperation *ppp = node;
   
   if(this.number > ppp.number)
     {
      return 1;
     }
   if(this.number < ppp.number)
     {
       return -1;
     }
   
  return 0;
 }   


void OnStart()
  {
   CList *list = new CList();
   list.Add(new COperation(3));
   list.Add(new COperation(4));
   list.Add(new COperation(7));
   list.Add(new COperation(2));
   list.Add(new COperation(3));
   list.Add(new COperation(9));
   list.Add(new COperation(0));
   list.Add(new COperation(1));
   
   Print("After Sort");
   COperation *node = list.GetFirstNode();
   string numbers = "";
   for(;node != NULL; node = node.Next())
     {
      numbers += (string)node.number + " ";
     }
    Print(numbers); 
    numbers = "";
     
   list.Sort(0);
   
   Print("Before Sort");
   node = list.GetFirstNode();
   for(;node != NULL; node = node.Next())
     {
      numbers += (string)node.number + " ";
     }
   Print(numbers); 
   
   
   delete list;
  }
ファイル:
sort.mq5  3 kb
 

ネストされたテンプレート(MQL4)を処理する際、型渡しの不具合が見られますが、どなたかお気づきの方はいらっしゃいますか?

具体的には、テンプレートメソッドを持つクラスAがあり、その内部で、メソッドが初期化されたのと同じ型Tを使ったテンプレートコンストラクタによって、別のクラスBのオブジェクトが生成されるのである。その結果、そのメソッド内部ではtypenameはintなど、渡された型を正しく定義しますが、Bのコンストラクタ内部ではtypenameはすでにstringになっています。

SD?

 
シートを配列にオーバーロードし、配列をソートしてオーバーロードし直すというのが最もオーソドックスな方法です。
 

私はいつもソートを使用していますが、全く問題ありません。

シグマ7i さんは、Coperation::Compare()というメソッドを間違ってオーバーライドしています。これは、ベースメソッドのCObject::Compare() が返す値の型が間違っており、コンパイラはこれを仮想ではなく、別のものとして扱います。その結果、オブジェクトの中でベースメソッドだけが呼び出され、コンパイラは子孫メソッドが存在しないと判断してしまうのです。

 
sigma7i:

しかし、常にベースクラスのCompareを呼び出します。でも、うまくいかないので、何かが間違っているのだと思います...。

virtual int Compare(const CObject *node,const int mode=0) const;