В продолжение темы. Оказывается, даже в случае только даункастов компилятор не может выбрать вариант:
class A { }; class B : public A { }; class C : public B { }; void f(A*) { } void f(B*) { } void OnInit() { C*c; f(c); // 'f' - ambiguous call to overloaded function }
На подумать
void f (int) {} void f (long) {} void OnStart() { short l; f(l); }
На подумать
О чём думать то? ) С такими случаями здесь всё в порядке вроде. И объекты классов тоже кастятся правильно. Проблема только с указателями.
p.s. Хотя не, вру, с объектами тоже не всё в порядке. Во втором случае с ними компилятор тоже не может определиться. Но зато хоть по первому случаю правильно отрабатывает, никакого ап-кастинга делать не пытается, и это радует )
О чём думать то? )
если честно, я не понимаю почему это в плюсах не считается ошибкой.
если честно, я не понимаю почему это в плюсах не считается ошибкой.
short -> int - Integral promotion
short -> long - Integral conversion
У первого приоритет выше.
если честно, я не понимаю почему это в плюсах не считается ошибкой.
Если long 32 битный, то действительно может быть неоднозначность. В противном случае всё очевидно вроде
нет, тут размер не главное :). Первое всегда - promotion, второе - conversion.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Ошибка компилятора. В приведённом коде он не может определиться между даун-кастом (который всегда разрешён неявно), и ап-кастом (который вообще недопустим в неявном виде в других языках). Если уж в MQL по какой-то причине разрешают неявный ап-каст (что само по себе ошибка), то он хотя бы должен иметь приоритет ниже, чем у даун-каста.
В C++ естественно всё компилируется нормально.