Новая версия платформы MetaTrader 5 build 2085: Интеграция с Python и массовые улучшения в тестере стратегий - страница 30

 

Когда уже выпустят обновление с возвратом старого интерфейса тестирования?

Достал этот Визард! Если хочется его сохранить, то переместите в отдельную вкладку, а не заменяйте им целый интерфейс.

 

Баг компилятора:

void f(int) { }  // Должна вызываться эта функция
void f(uint) { }

void OnStart()
{
  char a=0;
  f(a);  // 'f' - ambiguous call to overloaded function
}

Даже удивился немного - такая простецкая ситуация вроде бы...  В С++ всё нормально, разумеется.

 
Alexey Navoykov:

Баг компилятора:

Даже удивился немного - такая простецкая ситуация вроде бы...  В С++ всё нормально, разумеется.

Мне кажется такое поведение лучше, чем в С++. Тут компилятор пишет, что надо привести к одному из типов переменную.

 
Alexey Navoykov:
Кстати насчёт того, что "функция не понимает, какой тип она обрабатывает" - вы неправы.  Шаблон прекрасно работает с переданными ему аргументами. Ошибка возникает только при явном упоминании шаблонного типа в коде. 
Т.е. аргументы этого типа он понимает, а сам тип - нет. Как замечательно.

вы утверждаете не понятно что ))

для понимания темы, уберите шаблон из своей функции и проведите этот тест с "голым" типом, может тогда поймете в чем кроется ошибка, компилятор в данном случае ведет себя корректно

и еще в довесок - отладка не чистого кода затруднительна, о чем неоднократно предупреждали разработчики и о чем постоянно говорят "корифеи" кодинга в С++, старайтесь писать чистый код, т.е. как можно меньше использовать шаблоны, естественно все нужно делать без фанатизма и там где шаблон необходим его нужно использовать

 
Maksim Emeliashin:

Мне кажется такое поведение лучше, чем в С++. Тут компилятор пишет, что надо привести к одному из типов переменную.

он все сравнивает с С++, не понимая, что MQL5 это не С++, он основан на его синтаксисе, но по сути язык другой в своей основе, разработчики как то писали про это, кстати данное поведение компилятора так же считаю разумным в отличии от gcc, который такое проглатывает

 
Maksim Emeliashin:

Мне кажется такое поведение лучше, чем в С++. Тут компилятор пишет, что надо привести к одному из типов переменную.

Ничем оно не лучше. А пишет - потому что недоработка.  Ситуация тут однозначная и очевидная:  знаковые типы - к знаковым, беззнаковые - к беззнаковым.  Других вариантов и быть не может.  В MQL-компиляторе забыли учесть знаковость типов при перегрузке.  Здесь я погорячился!  Просто int имеет приоритет перед unsigned int в C++.

 
Alexey Navoykov:

Ничем оно не лучше. А пишет - потому что недоработка.  Ситуация тут однозначная и очевидная:  знаковые типы - к знаковым, беззнаковые - к беззнаковым.  Других вариантов и быть не может.  В MQL-компиляторе забыли учесть знаковость типов при перегрузке.

Мне кажется, поведение компилятора полностью соответствует приведению типов, описанных в хэлпе. Так что, тут "не ошибка, а системная функция".
 
Alexey Navoykov:

Ничем оно не лучше. А пишет - потому что недоработка.  Ситуация тут однозначная и очевидная:  знаковые типы - к знаковым, беззнаковые - к беззнаковым.  Других вариантов и быть не может.  В MQL-компиляторе забыли учесть знаковость типов при перегрузке.

char по своей сути не int, в с++ компиляторы проглатывают это видимо отталкиваясь на неявное приведение целочисленных типов если не будет потери точности, а в MQL5 это учитывается

не трудно ведь выполнить еще одну перегрузку или к примеру на этапе передачи аргумента, привести его к типу int, если вы так упорствуете на передаче char в функцию с таким аргументом?

например так:

//-------------------------
void f(char a_val);
void f(int a_val);
void f(uint a_val);

//-------------------------
void OnStart(void) {
   char _a = 0;
   f(_a);
}

//--- функции -------------
void f(char a_val) { }
void f(int a_val) { }  // Должна вызываться эта функция
void f(uint a_val) { }

или так:

//-------------------------
void f(int a_val);
void f(uint a_val);

//-------------------------
void OnStart(void) {
   char _a = 0;
   f((int)_a);
}

//--- функции -------------
void f(int a_val) { }  // Должна вызываться эта функция
void f(uint a_val) { }
 
Maksim Emeliashin:
Мне кажется, поведение компилятора полностью соответствует приведению типов, описанных в хэлпе. Так что, тут "не ошибка, а системная функция".

Как-раз таки противоречит. Там же показаны стрелочками маршруты (в данном случае у нас char->int).  Куда вы смотрели - непонятно.  В общем, давайте не будем засорять ветку.  Я выложил баг-репорт для разработчиков.

 
Alexey Navoykov:

Как-раз таки противоречит. Там же показаны стрелочками маршруты (в данном случае у нас char->int).  Куда вы смотрели - непонятно.  В общем, давайте не будем засорять ветку.  Я выложил баг-репорт для разработчиков.

p.s. Это всех касается. Свои личные мнения и советы, пожалуйста, выражайте в других ветках. Мне они не интересны.  Это ветка для прямой связи с разработчиками.

Специально, ради вас. Чтобы вы увидели, куда я смотрел. Если вы тут покажете мне прямую стрелку от char к int - буду вам премного благодарен.


И хамить тут не надо, все уже давно поняли, что вы шибко умный.

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