Errori, bug, domande - pagina 1588

 

Tu credi che

void f() const

non può cambiare il puntatore, ma può cambiare l'oggetto a cui il puntatore si riferisce. Beh, non ci sono tali puntatori in MQL5 che non possono essere cambiati. Pertanto, il modificatore const si riferisce sempre agli oggetti a cui si riferisce il puntatore.

 
Anton Zverev:

Allora dove pensi che sia il puntatore costante qui!

Nei metodi f() e g() il puntatore a diventa costante.

Beh, non ci sono tali puntatori in MQL5 che non possono essere cambiati. Pertanto, il modificatore const si riferisce sempre agli oggetti a cui il puntatore si riferisce

Non dovreste fare conclusioni così categoriche senza una sufficiente conoscenza dell'argomento. MQL ha puntatori costanti e li ha dichiarati allo stesso modo che in C++.

 
Alexey Navoykov:

Non dovreste fare conclusioni così categoriche senza una sufficiente conoscenza dell'argomento. I puntatori costanti in MQL esistono e sono dichiarati allo stesso modo che in C++.

Come dichiarare un puntatore costante in MQL5!
 

Per quanto ricordo la spiegazione degli sviluppatori, la costanza si applica sia all'oggetto che al puntatore.

Cioè scrivere const T* in MQL === const T* const in C++

Era così prima, forse ora è diverso, ma ne dubito.

 

Errore di compilazione

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

Errore di compilazione

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

Avrebbe dovuto essere così:

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

Avrebbe dovuto essere così:

Questo sarebbe stato compatibile con C++, d'altra parte - solo la classe B "interferisce" lì - se la rimuovi, compila senza errori. Questo è il motivo per cui è volto a controllare
 

Errore di compilazione

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

Errore di compilazione

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