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

 

Ошибка при компиляции (ME\1881\32)

template<typename T>
class B;
template<typename T>
class A {
        B<int> *f() { return NULL; }
};
template<typename T>
class B : public A<T> {}; //Error: 'A' - struct undefined
void OnStart()
{
        A<int> *a;
        B<int> *b;
}

А так:

void OnStart()
{
        B<int> *b;
        A<int> *a;
}
нормально. А какая разница?
 
fxsaber:

Это не причина.

this сильно помогает при чтении кода и помогает избегать ошибок в некоторых ситуациях.

Замечу что this в MQL не везде работает:

class A { protected:
        int a;
};
class B : public A {
        int a;
        void f1() { this.a    = 0; } //нормально
        void f2() { this.A::a = 0; } //Error: '::' - syntax error
};

что в С++ компилируется без ошибки

 
A100:

Замечу что this в MQL не везде работает:

что в С++ компилируется без ошибки

В C++ знают толк в извращениях. Возможно, где-то в макросах такое может быть использовано, но не напрямую.

 
В правом-верхнем углу все время висит значок, что у меня непрочитанные ЛС. Сбросить никак не получается - прочитал. Просьба добавить кнопку "Сделать все прочитанным".
 
fxsaber:

Возможно, где-то в макросах такое может быть использовано, но не напрямую.

Макросы тут совершенно ни при чем - замените this на обычный указатель и будет точно такой же синтаксис:

struct A {
        int x;
};
struct B : A {
        int x;
};
void OnStart()
{
        B b;
        b.A::x = 1; //Error: '::' - syntax error
}
В MQL нельзя явно обратиться к b.A::x, а в С++ можно. К чему такое ограничение?
 
A100:

Макросы тут совершенно ни при чем - замените this на обычный указатель и будет точно такой же синтаксис:

В данном случае оправдано. Вариант с this - не ясно, зачем так писать. Когда A:: и так обо всем говорит.

 
fxsaber:

Вариант с this - не ясно, зачем так писать. Когда A:: и так обо всем говорит.

О чем в данном случае говорит выделенное А:: ?

class A { public:
    static int a;
};
int A::a;
class C { public:
        int a;
};
class D : public C {};
class B : public D {
        int a;
        void f1() { this.a    = 0; }
        void f2() {      A::a = 0; }
        void f3() { this.C::a = 0; }
};
 
A100:

О чем в данном случае говорит выделенное А:: ?

Обращение к static-полю в данном контексте. Но я понял, на что намекаете, спасибо.

 
A100:

Ошибка при компиляции (ME\1881\32)

А так:

нормально. А какая разница?

К сожалению, исправлять это поведение в ближайшее время не будем.

Это "особенность" реализации шаблонов в MQL.

При таком коде, требуется инстанцировать B раньше A

 
A100:

Макросы тут совершенно ни при чем - замените this на обычный указатель и будет точно такой же синтаксис:

В MQL нельзя явно обратиться к b.A::x, а в С++ можно. К чему такое ограничение?

Вводить поддержку скопа при доступе к членам будем позже, при реализации множественного наследования от интерфейсов.