Fehler, Irrtümer, Fragen - Seite 2674

 

Bitte erinnern Sie mich, wenn es eine saubere Art und Weise zu lösen, die "zweideutigen Aufruf zu überladenen Funktion" Fehler, wenn Sie separate Behandlung für einfache Typen und Zeiger, wie dies benötigen:

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

    void process(BaseFunctor *ptr)
    {
    }

Hier berücksichtigt der Compiler, dass (BaseFunctor *) auch V entspricht. Sie können die Typumwandlung beim Aufruf einer Methode explizit angeben, aber das ist unschön. Wenn Sie in einer Schablonenfunktion einen Parameter per Verweis übernehmen, können Sie keine Konstanten und andere temporäre Werte übergeben (eine Variable ist erforderlich).

 
Stanislav Korotky:
Versuchen Sie, eine Überlast mit einem Link hinzuzufügen
 
TheXpert:
Versuchen Sie, eine Überlast mit einer Referenz hinzuzufügen

Meinen Sie Überladen mit Objektreferenz oder Zeigerreferenz (die es nicht zu geben scheint)? Ich weiß nicht, wie ich einen Zeiger auf eine verteilte neue Instanz in eine Objektreferenz einfügen kann.

 
Artyom Trishkin:

Ihr Zyklus ist für das Schließen von Positionen nicht korrekt. Machen Sie einen Rückwärtsgang.

Artyom Trishkin:

Ihr Zyklus ist für das Schließen von Positionen nicht korrekt. Machen Sie einen Rückwärtsgang.

Ich werde es versuchen, aber ist es nicht wichtig, wie man eine Schleife macht, wenn wir nach allen profitablen Positionen der gleichen Richtung suchen. Wir werden sie trotzdem alle durchgehen und die notwendigen Fälle abschließen.

 
Stanislav Korotky:

Meinen Sie Objektreferenzüberladung oder Zeigerreferenz (die es nicht zu geben scheint)? Ich weiß nicht, wie ich einen Zeiger auf eine verteilte Instanz in eine Objektreferenz einfügen kann.

Mit einer Objektreferenz.

Bei mir sieht es so aus:

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:

mit Bezug auf Objekte.

Bei mir sieht es so aus:

Immer noch nicht so einfach, sorry ;-). Die Klasse wird für die Vererbung verwendet:

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)
}

Wenn Sie einen BaseFunctor erstellen könnten, würde es funktionieren, ja. Aber das ist nicht der Fall.

 
Pavel Kozlov:

Hallo!

Vielen Dank, dass Sie den Fehler gemeldet haben!

Könnten Sie bitte das Problem mit dem Bild näher erläutern?

Momentan kein Problem

 

Der folgende Code gibt 牖漠摲牥⁳湩潦〉〮र〲थ⸰〰㠉┰〉〮र aus.

Es soll den Text test ausgeben

Die Dateien befinden sich im Ordner Files\\\Test\\.

Funktion sagt, dass Handle korrekt ist, es ist 1 und sofort GetLastError sagt Fehler 5008 Wrong handle ....

Was sollte ich tun?

//+------------------------------------------------------------------+
//| 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:
Sehr unangenehmer MT5(build 2316) Bug, der die weitere Entwicklung blockiert.
Sie erstellen mehrmals ein komplexes umhülltes Objekt mit dem internen Typ "C", aber es stellt sich heraus, dass es ein ganz anderer Datentyp ist, vielleicht "B", "int", was auch immer Sie wollen...

Ich habe viel Zeit und Mühe investiert, um herauszufinden und zu verstehen, dass das Problem nicht im Code, sondern im MQL-Compiler liegt. (C++ online:https://onlinegdb.com/H1R1fR5ML)
Vermutlich liegt das Problem in der Arbeit des Zwischenspeichers der Template-Klasse "main_wrapper" während der Codegenerierung zur Kompilierungszeit, wenn die interne Klasse "internal_wrapper" aus der Template-Klasse "A" als Parameter für verschiedene Datentypen (int, B*, B, C) übergeben wird.
Welcher erste Datentyp von der Template-Klasse "main_wrapper<A<TEMPLATE_TYPE>::internal_wrapper> erzeugt wird, dieser Datentyp wird in Zukunft in allen Objekten des Templates weiterverwendet werden.


Ein weiterer Fehler bei der Generierung des Codes der Vorlagenklasse wird weiter unten beschrieben.

Danke für den Beitrag, korrigiert

 
Vladimir Pastushak:

Der folgende Code gibt 牖漠摲牥⁳湩潦〉〮र〲थ⸰〰㠉┰〉〮र aus.

Es soll den Text test ausgeben

Die Dateien befinden sich im Ordner Files\\\Test\\.

Funktion sagt, Handle ist richtig, es ist 1 und sofort GetLastError sagt Fehler 5008 Wrong handle ....

Was sollte ich tun?

In welcher Kodierung liegt die Datei vor?