И также что-то перемудрили с приведением указателей.
Следующий код не компилируется:
class A
{
};
class B : protected A
{
};
voidOnStart()
{
A* a;
B* b= (B*)a; // conversion from 'B *' to 'A *' is not accessible because of inheritance access
}
С++ преобразует этот код в reinterpret_cast, а MQL в dynamic_cast. И насколько я понимаю, это как раз тот случай когда компилятор может найти ошибку динамик каста во время компиляции.
reinterpret_cast в данном случае нелегитимен, поэтому то что этот код компилируется в С++ не аргумент.
С++ преобразует этот код в reinterpret_cast, а MQL в dynamic_cast. И насколько я понимаю, это как раз тот случай когда компилятор может найти ошибку динамик каста во время компиляции.
reinterpret_cast в данном случае нелегитимен, поэтому то что этот код компилируется в С++ не аргумент.
Погодите, зачем вы мешаете всё в кучу? Причём здесь динамик каст? В задачи компилятора не входят игры в Шерлока Холмса и что-то там искать в логике программы. Он выполняет лишь формальную проверку соответствия стандарту языка, не более. И с точки зрения стандарта у меня всё корректно.
Тем более что дело тут вообще не в cast. Если бы вы внимательно посмотрели мой пример, то увидели бы, что проблема там связана с protected. Если его заменить на public, то всё нормально. Сам объект от этого не меняется. Т.е. в компиляторе MQL просто излишнее ограничение, вот и всё.
Так что не стоит строить домыслы и искать тайный смысл там, где его явно нет. А есть лишь банальная ошибка компилятора.
struct A {int i;};
void F1( const A a ) {} // 'const' - objects are passed by reference onlyvoid F2( const A &a ) // почему только через ссылку (&) допускается?
{ const A b = a; } // ведь так (напрямую присвоение) можно!
datetime time;
Print((string)time); // работает приведение типов datetime -> stringMqlTick Tick;
Print((string)Tick); // может, сделать автоматическое приведение Mql*-типов (MqlTradeResult, MqlTradeRequest и т.д.) к string?
Иногда надо распечатать тик, торговый запрос или ответ и т.д. Возможно ли будет это сделать через приведение к string?
И также что-то перемудрили с приведением указателей.
Следующий код не компилируется:
хотя приведение тут явное. В С++ всё работает.
И также что-то перемудрили с приведением указателей.
Все правильно компилятор ругается
Иди почитай про dynamic_cast, static_cast и reinterpret_cast и про то когда их правильно использовать, а когда нет.
С++ преобразует этот код в reinterpret_cast, а MQL в dynamic_cast. И насколько я понимаю, это как раз тот случай когда компилятор может найти ошибку динамик каста во время компиляции.
reinterpret_cast в данном случае нелегитимен, поэтому то что этот код компилируется в С++ не аргумент.
С++ преобразует этот код в reinterpret_cast, а MQL в dynamic_cast. И насколько я понимаю, это как раз тот случай когда компилятор может найти ошибку динамик каста во время компиляции.
reinterpret_cast в данном случае нелегитимен, поэтому то что этот код компилируется в С++ не аргумент.
Погодите, зачем вы мешаете всё в кучу? Причём здесь динамик каст? В задачи компилятора не входят игры в Шерлока Холмса и что-то там искать в логике программы. Он выполняет лишь формальную проверку соответствия стандарту языка, не более. И с точки зрения стандарта у меня всё корректно.
Тем более что дело тут вообще не в cast. Если бы вы внимательно посмотрели мой пример, то увидели бы, что проблема там связана с protected. Если его заменить на public, то всё нормально. Сам объект от этого не меняется. Т.е. в компиляторе MQL просто излишнее ограничение, вот и всё.
Так что не стоит строить домыслы и искать тайный смысл там, где его явно нет. А есть лишь банальная ошибка компилятора.