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

 
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 по-другому, это неправильно
 
TheXpert:

если на mql по-другому, это неправильно.

Дискуссия не на тему правильно, а о том, что это якобы ошибка. Мое мнение - нет ошибки, такая реализация задумана на данный момент.

 
fxsaber:

Мое мнение - нет ошибки, такая реализация задумана на данный момент.

тогда зачем вы про плюсы спрашиваете? макрос это недошаблон. зачем вообще аналогию между ними проводить?

 
TheXpert:

тогда зачем вы про плюсы спрашиваете?

Любопытство.

макрос это недошаблон. зачем вообще аналогию между ними проводить?

C++ по какой-то причине приводится, как эталон в данном контексте. Почему не укладывается понимание текущей реализации MQL5 - не знаю.

 
TheXpert:

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

Основной пример на С++ компилируется без ошибок

На C++ не компилируется пример подобный такому:

class A;
void OnStart()
{
        Print( sizeof( A )); //нормально
}

потому что это сама по себе ошибка, но fxsaber будет сейчас доказывать что это на самом деле правильно (так было в MQL задумано) и мы чего то не понимаем