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

 

И также что-то перемудрили с приведением указателей.

Следующий код не компилируется:

class A
{
};

class B : protected A
{
};

void OnStart()
  {
    A* a;
    B* b= (B*)a;  // conversion from 'B *' to 'A *' is not accessible because of inheritance access
  }

хотя приведение тут явное.   В С++ всё работает.

 
Alexey Navoykov:

И также что-то перемудрили с приведением указателей.

Все правильно компилятор ругается
 
Комбинатор:
Все правильно компилятор ругается
Что правильного то?   Открой С++ и проверь как должно быть.
 
Alexey Navoykov:
Иди почитай про dynamic_cast, static_cast и reinterpret_cast и про то когда их правильно использовать, а когда нет.
 
Комбинатор:
Иди почитай про dynamic_cast, static_cast и reinterpret_cast и про то когда их правильно использовать, а когда нет.
Давайте обойдёмся без лишнего флуда и философии, ок?    Речь идёт о конкретной конструкции, которая должна компилироваться.
 
Alexey Navoykov:

С++ преобразует этот код в 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 only
void F2( const A &a )   // почему только через ссылку (&) допускается?
{ const A b = a; }      // ведь так (напрямую присвоение) можно!
Поясните комментарий в коде, пожалуйста.
 
datetime time;
Print((string)time); // работает приведение типов datetime -> string

MqlTick Tick;  
Print((string)Tick); // может, сделать автоматическое приведение Mql*-типов (MqlTradeResult, MqlTradeRequest и т.д.) к string?
Иногда надо распечатать тик, торговый запрос или ответ и т.д. Возможно ли будет это сделать через приведение к string?