Errores, fallos, preguntas - página 1588

[Eliminado]  

Usted cree que

void f() const

no puede cambiar el puntero, pero puede cambiar el objeto al que se refiere el puntero. Pues bien, en MQL5 no existen tales punteros que no puedan ser modificados. Por lo tanto, el modificador const siempre se refiere a los objetos a los que se refiere el puntero.

 
Anton Zverev:

Entonces, ¿dónde crees que está el puntero constante aquí?

En los métodos f() y g() el puntero a se vuelve constante.

Pues bien, en MQL5 no existen tales punteros que no puedan ser modificados. Por lo tanto, el modificador const siempre se refiere a los objetos a los que se refiere el puntero

No debes hacer conclusiones tan categóricas sin tener suficiente conocimiento sobre el tema. MQL tiene punteros constantes y los declara de la misma manera que en C++.

[Eliminado]  
Alexey Navoykov:

No se deben hacer conclusiones tan categóricas sin un conocimiento suficiente del tema. Los punteros constantes en MQL existen y se declaran de la misma manera que en C++.

¡Cómo declarar un puntero constante en MQL5!
 

Por lo que recuerdo de la explicación de los desarrolladores, la constancia se aplica tanto al objeto como al puntero.

Es decir, escribir const T* en MQL === const T* const en C++

Antes era así, quizás ahora sea diferente, pero lo dudo.

 

Error de compilación

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

Error de compilación

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

Debería haber sido así:

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

Debería haber sido así:

Por otro lado, esto hubiera sido compatible con C++ - sólo la clase B "interfiere" allí - si la eliminas, compila sin errores. Por ello, su objetivo es comprobar
 

Error de compilación

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

Error de compilación

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