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

 
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

 
Stanislav Dray:

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

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

Да, это косяк.

 
A100:

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

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

Вы не совсем понимаете, что такое шаблоны. А они сродни макросам, только с некоторыми фишками.

Вот такой код

template<typename T>
void f() { class T{ MqlTick a; }; 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>();
}

выдаст

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

Потому что T - это подстава, как в макросах, только с некоторыми оговорками. По итогу имеем, что создается сигнатура. Внутри функции никто не знает про A, которое подставляется вместо T в функции. Но Вы определяете этот A внутри, поэтому дальше ошибки компиляции не происходит. Вставил MqlTick вовнутрь, чтобы показать, что этот A - никакого отношения не имеет к другим одноименным классам.

Короче, внутрифункциональные классы в MQL5 не видны вне родительской функции. В качестве T передается только название типа, как класса. При этом в названии нет упоминания функции-родителя.

Т.е. все довольно логично объяснимо. Это не ошибка, а такая ограниченная реализация.


ЗЫ Наверное, на собеседовании C++-программер скажет, что такое невозможно

template<typename T>
void f() { class T{}; }


MQL5 - вполне.

 
fxsaber:

Вы не совсем понимаете, что такое шаблоны.

fxsaber:
 

ЗЫ Наверное, на собеседовании C++-программер скажет, что такое невозможно

Если Вы считаете что на C++ такое невозможно - то это значит что не я, а Вы не понимаете что такое шаблоны и как они работают... тем более что не можете отличить небрежную реализацию от ограниченной

 
A100:

Если Вы считаете что на C++ такое невозможно - то это значит что не я, а Вы не понимаете что такое шаблоны и как они работают... тем более что не можете отличить небрежную реализацию от ограниченной

Прочтите первое слово предложения, на которое даете свой комментарий. Мои представления о шаблонах и макросах в MQL5 таковы, что без попыток компиляции осознаю, что Ваши примеры компилироваться на MQL5 не будут. С++ - не знаю, что не мешает.


ЗЫ Был бы благодарен, если бы показали реакцию C++ на этот код

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2018.09.03 07:16

ЗЫ Наверное, на собеседовании C++-программер скажет, что такое невозможно

template<typename T>
void f() { class T{}; }
 
fxsaber:

ЗЫ Был бы благодарен, если бы показали реакцию C++ на этот код

Реакция такая же как и в MQL. А почему она должна быть другой? Шаблон он и в Африке шаблон
 
fxsaber:

Вы не совсем понимаете, что такое шаблоны. А они сродни макросам, только с некоторыми фишками.

да, такой пример на плюсах не компилится

error: declaration of ‘struct f()::T’ shadows template param template<typename T>

но даже если бы он компилился, результат бы вас удивил, потому что имя класса было бы просто "T".

если на mql по-другому, это неправильно
Причина обращения: