Ошибки, баги, вопросы - страница 1588

 

Вы считаете, что

void f() const

не может менять указатель, но может менять объект, на который указатель ссылается. Ну нет в MQL5 таких указателей, которые нельзя менять. Поэтому модификатор const всегда относится к объектам, на которые ссылается указатель.

 
Anton Zverev:

Тогда где здесь, по-вашему, константный указатель?!

В методах f() и g() указатель a становится константным.

Ну нет в MQL5 таких указателей, которые нельзя менять. Поэтому модификатор const всегда относится к объектам, на которые ссылается указатель

Не стоит делать таких категоричных выводов, не обладая достаточными знаниями о предмете.  Константные указатели в MQL есть и объявляются точно также как и в C++.

 
Alexey Navoykov:

Не стоит делать таких категоричных выводов, не обладая достаточными знаниями о предмете.  Константные указатели в MQL есть и объявляются точно также как и в C++.

Как объявить в MQL5 константный указатель?!
 

Насколько я помню объяснение разработчиков, константность применяется и к объекту и к указателю.

Т.е. запись const T* в MQL === const T* const в C++

Так было раньше, сейчас возможно по-другому, но сомневаюсь.

 

Ошибка компиляции

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

Ошибка компиляции

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

Надо было так:

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

Надо было так:

Так было бы совместимо с С++, с другой стороны - там "мешает" только class B - если его убрать, то компилируется без ошибок. Именно по этой причине и направлено на проверку
 

Ошибка компиляции

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

Ошибка компиляции

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
};
Причина обращения: