template<typename T> void F(T)
{
class A
{
void f() { new A; } // 'A' - declaration without typevoid g() { A* a; } // 'A' - pointer to this function type is not supported yet
};
};
voidOnStart()
{
F(0);
}
Und auch mit der Zeigerumwandlung stimmt etwas nicht.
Der folgende Code lässt sich nicht kompilieren:
class A
{
};
class B : protected A
{
};
voidOnStart()
{
A* a;
B* b= (B*)a; // conversion from 'B *' to 'A *' is not accessible because of inheritance access
}
obwohl die Umwandlung hier explizit ist. Alles funktioniert in C++.
C++ wandelt diesen Code in reinterpret_cast und MQL in dynamic_cast um. Und soweit ich weiß, ist dies genau der Fall, wenn der Compiler während der Kompilierung einen Dynamiccast-Fehler finden kann.
reinterpret_cast ist in diesem Fall unzulässig, so dass die Tatsache, dass dieser Code in C++ kompilierbar ist, kein Argument darstellt.
C++ wandelt diesen Code in reinterpret_cast und MQL in dynamic_cast um. Und soweit ich weiß, ist dies genau der Fall, wenn der Compiler während der Kompilierung einen Dynamiccast-Fehler finden kann.
Reinterpret_cast ist in diesem Fall unzulässig, so dass die Tatsache, dass dieser Code in C++ kompilierbar ist, kein Argument darstellt.
Moment, warum verwechseln Sie das? Was hat dynamically cast damit zu tun? Es gehört nicht zu den Aufgaben des Compilers, Sherlock Holmes zu spielen und etwas in der Programmlogik zu suchen. Er führt nur eine formale Prüfung der Übereinstimmung mit dem Sprachstandard durch, mehr nicht. Und vom Standpunkt des Standards aus ist alles korrekt.
Wenn Sie sich mein Beispiel genau angesehen hätten, wäre Ihnen aufgefallen, dass das Problem mit protected zusammenhängt. Wenn Sie es auf public ändern, ist alles in Ordnung. Das Objekt selbst wird dadurch nicht verändert, d.h. der MQL-Compiler hat nur eine unnötige Einschränkung, das ist alles.
Spekulieren Sie also nicht und suchen Sie nicht nach einer geheimen Bedeutung, wo es keine gibt, sondern nur nach einem trivialen Compilerfehler.
Kompilierungsfehler:
Hier sind noch ein paar weitere Fehler:
Und auch mit der Zeigerumwandlung stimmt etwas nicht.
Der folgende Code lässt sich nicht kompilieren:
obwohl die Umwandlung hier explizit ist. Alles funktioniert in C++.
Und es ist auch etwas faul, wenn man die Wegweiser einführt.
Es ist richtig, der Compiler kämpft.
Lesen Sie mehr über dynamic_cast, static_cast und reinterpret_cast und darüber, wann man sie richtig verwendet und wann nicht.
C++ wandelt diesen Code in reinterpret_cast und MQL in dynamic_cast um. Und soweit ich weiß, ist dies genau der Fall, wenn der Compiler während der Kompilierung einen Dynamiccast-Fehler finden kann.
reinterpret_cast ist in diesem Fall unzulässig, so dass die Tatsache, dass dieser Code in C++ kompilierbar ist, kein Argument darstellt.
C++ wandelt diesen Code in reinterpret_cast und MQL in dynamic_cast um. Und soweit ich weiß, ist dies genau der Fall, wenn der Compiler während der Kompilierung einen Dynamiccast-Fehler finden kann.
Reinterpret_cast ist in diesem Fall unzulässig, so dass die Tatsache, dass dieser Code in C++ kompilierbar ist, kein Argument darstellt.
Moment, warum verwechseln Sie das? Was hat dynamically cast damit zu tun? Es gehört nicht zu den Aufgaben des Compilers, Sherlock Holmes zu spielen und etwas in der Programmlogik zu suchen. Er führt nur eine formale Prüfung der Übereinstimmung mit dem Sprachstandard durch, mehr nicht. Und vom Standpunkt des Standards aus ist alles korrekt.
Wenn Sie sich mein Beispiel genau angesehen hätten, wäre Ihnen aufgefallen, dass das Problem mit protected zusammenhängt. Wenn Sie es auf public ändern, ist alles in Ordnung. Das Objekt selbst wird dadurch nicht verändert, d.h. der MQL-Compiler hat nur eine unnötige Einschränkung, das ist alles.
Spekulieren Sie also nicht und suchen Sie nicht nach einer geheimen Bedeutung, wo es keine gibt, sondern nur nach einem trivialen Compilerfehler.