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

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

А какая принципиальная разница между (1)(2) и (3)(4) ???

Если объявлять классы (3)(4) вне функций - ошибок не возникает. Если объявить внутри функции - возникает.

 
Vladimir Pastushak:

C чем может быть связано следующие поведение

компилируешь индикатор работает правильно, компилируешь повторно индикатор работает не правильно. В тестере работает правильно ?

Какой индикатор?

 
fxsaber:

Что выдает C++ здесь?

Чтобы это заработало в MQL5, нужно иметь на выходе две разные строки, а не одинаковые. Но тогда должен быть совсем иной механизм формирования сигнатур. Если же C++ выдает один и тот же результат на печати, тогда сильно падает цена __FUNCSIG__.

Результат: C++

void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )

Как видите строки разные... используется сигнатура функции

 
A100:

Результат: C++

void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )

Как видите строки разные... используется сигнатура функции

MQL5 выдает

void f<A>(A&)

Т.е. нет сигнатуры класса внутри функции. Когда-нибудь будет поддерживаться.


А если класс глобальный, то C++ какую из строк выдает?

void f<::A>( ::A& )

void f<A>( A& )

 
fxsaber:

MQL5 выдает

Т.е. нет сигнатуры класса внутри функции. Когда-нибудь будет поддерживаться.

Если устаревшие C++ компиляторы не поддерживают это то они в исходном коде выдают ошибку уже на первой строке (1). Поэтому изначально вопрос так и ставился: Почему в одном случае ошибка, а в другом - нормально?

Ожидалось в обоих случаях одинаковое поведение: или ошибка или без ошибок. И ошибка не в отсутствии поддержки как таковой, а в неодинаковом поведении при прочих равных условиях (как и в этом примере)

 
fxsaber:
А если класс глобальный, то C++ какую из строк выдает?

void f<::A>( ::A& )

void f<A>( A& )

Второй вариант

 
A100:

Если устаревшие C++ компиляторы не поддерживают это то они в исходном коде выдают ошибку уже на первой строке (1). Поэтому изначально вопрос так и ставился: Почему в одном случае ошибка, а в другом - нормально?

Ожидалось в обоих случаях одинаковое поведение: или ошибка или без ошибок. И ошибка не в отсутствии поддержки как таковой, а в неодинаковом поведении при прочих равных условиях (как и в этом примере)

Так объяснимо же. Компилятор идет сверху вниз по коду, формируя на ходу соответствующие сигнатуры. Первую сигнатуру создал без проблем. Доходит до второй - а такая уже есть. Вот и ошибка на второй строке.

 
Georgiy Merts:

Если объявлять классы (3)(4) вне функций - ошибок не возникает. Если объявить внутри функции - возникает.

Если в исходном примере
        class  A2 { int i; }; //(3)

заменить на

        interface A2 {};      //(5)

то и внутри функции ошибок не возникает... а какая принципиальная разница?

 
fxsaber:

Так объяснимо же. Компилятор идет сверху вниз по коду, формируя на ходу соответствующие сигнатуры. Первую сигнатуру создал без проблем. Доходит до второй - а такая уже есть. Вот и ошибка на второй строке.

А так почему в MQL компилируется без ошибок?

template<typename T>
void f() { Print(__FUNCSIG__); }
void g1() { class A { int    x; } a; f<A>(); }
void g2() { class A { double x; } a; f<A>(); }
void OnStart()
{
        g1();
        g2();
}

Результат: MQL                          C++

                 void f<A>()                void f<g1::A>()
                 void f<A>()                void f<g2::A>()

 Почему тут сигнатуры создаются без помех?

 
A100:

А так почему в MQL компилируется без ошибок?

Результат: MQL                          C++

                 void f<A>()                void f<g1::A>()
                 void f<A>()                void f<g2::A>()

 Почему тут сигнатуры создаются без помех?

Одна только создается. Более того, в f Вы не сможете использовать T. В общем, ситуация очевидная для меня.

Причина обращения: