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

 

このように単純な型とポインタを別々に処理する必要がある場合に、「オーバーロードされた関数へのあいまいな呼び出し」エラーを解決するためのきちんとした方法があれば教えてください。

    template<typename V>
    void process(V value)
    {
    }

    void process(BaseFunctor *ptr)
    {
    }

ここでコンパイラは、(BaseFunctor *)もVに対応すると見なす。メソッドを呼び出す際に明示的に型変換を 指定することもできますが、醜いです。テンプレート関数でパラメータを参照で取る場合、定数などの一時的な値を渡すことはできません(変数が必要です)。

 
Stanislav Korotky:
リンクでオーバーロードを追加してみる
 
TheXpert:
を参照するオーバーロードを追加してみる。

オブジェクト参照やポインタ参照(存在しないようです)によるオーバーロードのことでしょうか?分散された新しいインスタンスへのポインタをオブジェクトの参照に滑り込ませる方法がわからない。

 
Artyom Trishkin:

ポジションを閉じる 際のサイクルが正しくありません。逆回転をさせる。

アルチョム・トリシキン

ポジションを閉じる 際のサイクルが正しくありません。逆回転をさせる。

やってみますが、同じ方向の全ての利益確定ポジションを探すのであれば、ループの仕方は関係ないのでは?とにかく全部見て、必要なものを閉じる。

 
Stanislav Korotky:

オブジェクト参照やポインタ参照(存在しないようです)によるオーバーロードのことでしょうか?分散インスタンスへのポインタをオブジェクト参照に滑り込ませる方法がわからない。

オブジェクトリファレンスで

こんな感じで持っています。

class C {};

template<typename V>
void process(V value)
{
}

/* если добавить, компилируется
template<typename V>
void process(V& value)
{
}
*/

void process(C *ptr)
{
}
    
void OnStart()
  {
      C c;
      process(&c); // pointer, ok
      process(c); // 'process' - no one of the overloads can be applied to the function call       test2.mq5       32      7
  }
 
TheXpert:

オブジェクトを参照しながら

こんな感じで持っています。

まだ、そんなに簡単にはいきませんね、すみません;-)。クラスは継承のために使用されます。

class BaseFunctor
{
  public:
    virtual void process() = 0;
};

class MyFunctor: public BaseFunctor
{
  public:
    virtual void process() override
    {
    }
};

template<typename V>
void process(V value)
{
}

void process(BaseFunctor *ptr)
{
}

void process(BaseFunctor &ref)
{
}

void OnStart()
{
  process(new MyFunctor()); // 'process' - ambiguous call to overloaded function, could be one of 3 function(s)
}

BaseFunctorを作ることができれば、うまくいきますね、はい。でも、そうではないんです。

 
Pavel Kozlov:

こんにちは。

エラーのご報告 ありがとうございました

写真の問題点を詳しく教えてください。

現時点では問題なし

 

以下のコードは、"牖漠摲牥湩 "と出力します。

テキストテストが出力されるはずです

Files' FilesTest' Files フォルダにあります。

関数は、ハンドルは正しく、それは1であり、すぐにGetLastErrorは エラー5008間違ったハンドル....と言います。

どうしたらいいのでしょうか?

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   core();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+
void core()
  {
   string value = "", name = "";

   name =  "Test" + "\\test.csv";
   Print(FileIsExist(name));

   ResetLastError();

   int m_hendle = -1;
   m_hendle = FileOpen(name, FILE_READ | FILE_WRITE | FILE_CSV);
   if(m_hendle != INVALID_HANDLE)
     {
      Print((string)m_hendle + "    " + name + " [" + (string)FileSize(m_hendle) + "]"+ (string)GetLastError());
       while(!FileIsEnding(m_hendle))
        {
         string sCurrent = FileReadString(m_hendle);
         Print("sCurrent = ", sCurrent);
        }
      FileClose(m_hendle);
     }
  }
//+------------------------------------------------------------------+
 
Sergey Dzyublik:
MT5(ビルド2316)の非常に厄介なバグがあり、今後の開発を阻害しています。
内部型 "C "の複雑なラップオブジェクトを何度も作成したが、結局は全く別のデータ型、"B"、"int"、何でもいいのだが......。

問題はコードにあるのではなく、MQLコンパイラにあることを発見し理解するのに多くの時間と労力を要しました。(C++ オンライン: https://onlinegdb.com/H1R1fR5ML)
おそらく、テンプレート・クラス「A」の内部クラス「internal_wrapper」を異なるデータ型(int、B*、B、C)のパラメータとして渡す場合のコンパイル時のコード生成時のテンプレート・クラス「main_wrapper」キャッシュの働きに問題があるものと思われます。
最初のデータ型は、テンプレート・クラス「main_wrapper<A<TEMPLATE_TYPE>::internal_wrapper>」によって作られ、このデータ型は将来、テンプレートの全てのオブジェクトでさらに使われることになります。


また、テンプレート・クラス・コードの生成に関するバグについては、後述します。

投稿ありがとうございます、修正しました

 
Vladimir Pastushak:

以下のコードは、"牖漠摲牥湩 "と出力します。

テキストテストが出力されるはずです

Files' FilesTest' Files フォルダにあります。

関数はハンドルが正しいと言い、それは1であり、すぐにGetLastErrorはエラー5008 Wrong handle ...と言った。

どうしたらいいのでしょうか?

ファイルのエンコーディングは?