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

 
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. В общем, ситуация очевидная для меня.

 
fxsaber:

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

Это сама по себе ошибка
template<typename T>
void f() { Print( sizeof( T )); }
struct A { int a; };
void OnStart()
{
        f<int>(); //(1)//нормально
        f<A>();   //(2)//нормально
struct B { int b; };
        f<B>();   //(3)//Error: 'B' - undeclared identifier
}
А какая принципиальная разница между (1)(2) и (3) ???
 
fxsaber:

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

Более того, нарушил Ваш запрет на использование T в f

template<typename T>
void f() { class T; Print(__FUNCSIG__, ":" , sizeof(T)); }
template<typename T1, typename T2>
void g() { class T1 { T2 x; } a; f<T1>(); }
void OnStart()
{
class A {};
        g<A,int   >();
        g<A,double>();
}

Как видите компилируется без ошибок, а то что результат абсурдный - не важно главное что все "объяснимо"

 
Всем привет. Помогите. Не могу совершать сделки по золоту, всё работает, а именно сделки не могу совершать. Вот скрины, как это выглядит.
Файлы:
 

Какой сакральный смысл в этом коде,зачем его вообще впихнули в стандартную библиотеку?

   if(IsStopped(__FUNCTION__))
      return(false);

Теперь невозможно юзать функции закрытия позиций или ордеров из стандартной библиотеки в ОнДеинит , например при  REASON_REMOVE