Fehler, Irrtümer, Fragen - Seite 1588

 

Sie glauben, dass

void f() const

kann den Zeiger nicht ändern, wohl aber das Objekt, auf das sich der Zeiger bezieht. Nun, in MQL5 gibt es keine solchen Zeiger, die nicht geändert werden können. Daher bezieht sich der Modifikator const immer auf die Objekte, auf die sich der Zeiger bezieht.

 
Anton Zverev:

Was glauben Sie denn, wo hier der ständige Zeiger ist!

In den Methoden f() und g() wird der Zeiger a konstant.

Nun, in MQL5 gibt es keine solchen Zeiger, die nicht geändert werden können. Daher bezieht sich der Modifikator const immer auf die Objekte, auf die sich der Zeiger bezieht

Sie sollten solche kategorischen Schlussfolgerungen nicht ohne ausreichende Kenntnisse über das Thema ziehen. MQL hat konstante Zeiger und deklariert sie auf die gleiche Weise wie in C++.

 
Alexey Navoykov:

Sie sollten solche kategorischen Schlussfolgerungen nicht ohne ausreichende Kenntnisse des Themas ziehen. Konstante Zeiger in MQL existieren und werden auf die gleiche Weise deklariert wie in C++.

Wie man einen konstanten Zeiger in MQL5 deklariert!
 

Soweit ich mich an die Erklärung der Entwickler erinnere, gilt die Konstante sowohl für Objekte als auch für Zeiger.

D.h. das Schreiben von const T* in MQL === const T* const in C++

Das war früher so, vielleicht ist es jetzt anders, aber ich bezweifle es.

 

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

Kompilierungsfehler

template<typename T>
class A { public: T t; };
class B { public:
template<typename T> void g(   T  * );
template<typename T> void f( A<T> * );
};
template<typename T> void B::g(   T  * ) {} //нормально
template<typename T> void B::f( A<T> * ) {} //ошибка: 'f' - member function already defined with different parameters
void OnStart()
{
        A<int> a;
        B b;
        b.g( &a );
        b.f( &a );
}
 
A100:

...

template<typename T>
bool A::operator==( const A& )  { return false; }

Es hätte so sein sollen:

template<typename T>
bool A<T>::operator==( const A& )  { return false; }
 
Alexey Navoykov:

Es hätte so sein sollen:

Dies wäre andererseits mit C++ kompatibel gewesen - nur Klasse B "stört" dort - wenn man sie entfernt, kompiliert sie ohne Fehler. Aus diesem Grund zielt sie auf die Überprüfung
 

Kompilierungsfehler

template<typename T>
class A {};
class B {
        void A() {}
        void f() { A(); } //error: 'A' - template mismatch
};
 

Kompilierungsfehler

template<typename T> class A {};
template<typename T> class B {};
class C {
template<typename T>
        void f( B<A<T> > * ) {}
        B<A<int> > *b;
public:
        void g() { f( b ); } //error: 'f' - cannot to apply function template
};
Grund der Beschwerde: