Fehler, Irrtümer, Fragen - Seite 1965

 
fxsaber:

Ganz genau! Jetzt kann ich f alle möglichen Funktionen und Variablen gleichzeitig aufrufen. Bei solchen Zweideutigkeiten muss ein gewisser gesunder Menschenverstand w alten, um nicht versehentlich Fehler zu verursachen. Meiner Meinung nach ist es logisch, eine leere Zeichenkette an typename f auszugeben, anstatt Probleme zu verursachen, wenn man versehentlich ein anderes f aufnimmt und definiert.

Suchen Sie nicht überall so stur nach dem gesunden Menschenverstand, vor allem nicht bei den Wanzen. Wenn man Ihnen zuhört, ist jeder Fehler in MQL überhaupt kein Fehler, sondern eine Funktion, die von den klugen Entwicklern eingebaut wurde ))

Wie bereits erwähnt, sollten Sie im Zweifelsfall zunächst eine Prüfung in C++ durchführen und dann eine Lösung finden.

Was Mehrdeutigkeiten betrifft, so sollten sie einen Compilerfehler verursachen und keine Probleme verursachen. In der Probe A100 war alles klar und eindeutig, daher verstehe ich nicht ganz, was Sie meinen. Wenn man eine Funktion überladen muss, überlädt man sie und behebt die Kompilierungsfehler bei Zweideutigkeiten, und das war's.

 

Wie initialisiere ich ein statisches Mitglied einer Vorlagenklasse in MQL?

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

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

Wie initialisiere ich ein statisches Mitglied einer Vorlagenklasse in MQL?

Wenn es sich um ein einfaches Problem handelt, bringen Sie es in eine Nicht-Template-Basisklasse ein und erben es. Im Allgemeinen weiß ich nicht, wie das geht.
 
Stanislav Korotky:

Wie initialisiere ich ein statisches Mitglied einer Vorlagenklasse in MQL?

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

A100:

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

Im Allgemeinen entspricht diese Methode natürlich nicht C++, aber sie funktioniert in MQL.

Ich hatte ein ähnliches Problem mit einer Methode außerhalb der Klasse:

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

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

Dank Ihnen haben wir die Lösung gefunden:

template<typename T>
void A::f() { }
Auch das ist natürlich falsch, denn es bedeutet die Definition einer Template-Methode, nicht einer Methode einer Template-Klasse. Und wenn eine Klasse beides enthält, gibt es eine Mehrdeutigkeit
 
Alexey Navoykov:

Ich hatte ein ähnliches Problem, als ich eine Methode außerhalb des Unterrichts anwenden wollte:

Das ist viel bequemer. Die einzige Einschränkung ist, dass Sie keine andere Klasse (wie im Beispiel) dazwischen haben können

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Fehler, Irrtümer, Fragen

A100, 2016.05.19 23:26

Kompilierungsfehler

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:

weil es bedeutet, dass eine Schablonenmethode und nicht eine Methode einer Schablonenklasse definiert wird. Und wenn die Klasse beides enthält, gibt es eine Mehrdeutigkeit

Es wird keine Unklarheiten geben, denn alles ist vorher durchdacht worden (c). Wir müssen die Template-Zeile zweimal wiederholen (die obere Zeile bezieht sich auf eine Klasse, die untere auf eine Methode)
 
A100:
Das wird nicht der Fall sein, denn es wurde alles schon vor uns erdacht (c). Sie müssen die Template-Zeile zweimal wiederholen (die obere Zeile bezieht sich auf die Klasse, die untere auf die Methode)

Mann, das sieht ja echt beschissen aus.

A100:
So ist es viel bequemer.

Ja, nun, <T> nicht einfügen zu müssen, ist eine große Erleichterung).

 
Alexey Navoykov:

Ja, ein <T> nicht einfügen zu müssen, ist eine große Erleichterung).

Ich meinte, dass es praktisch ist, eine Methode außerhalb einer Klasse zu platzieren
 
Alexey Navoykov:

Ich hatte ein ähnliches Problem, als ich eine Methode außerhalb des Unterrichts anwenden wollte:

Das ist natürlich falsch, denn es bedeutet, dass eine Schablonenmethode und nicht eine Methode einer Schablonenklasse definiert wird. Und wenn die Klasse beides enthält, kommt es zu Mehrdeutigkeiten.

Mir ist aufgefallen, dass Methoden oft außerhalb der Klasse platziert werden, aber warum? Ich habe mir die SB angesehen, also "kleine" Methoden werden in einer Zeile auf einmal definiert, "lange" Methoden werden außerhalb der Klasse definiert. Es gibt keinen Wahrnehmungskomfort, denn ALT+G bietet in der externen Definition nicht einen, sondern zwei Übergangspunkte. Und wenn es Überlastungen gibt, dann jeweils ein Vielfaches von zwei. Und ALT+M zeigt bereits alles auf einmal an.

Vielleicht ist das eine Art Tribut an die Klarheit der Schnittstellendefinition, aber bis jetzt bin ich noch nicht dazu gekommen.