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

 
A100:
Пусто... а почему?
void f() {}
void f( int ) {}
 
ffxsaber:

Вы снова добавили неоднозначность

#ifdef __cplusplus
void f() {}
void f( int ) {}
void OnStart()
{
        void *ff = &f; //Error: E2336
}
#endif
пока f была одна - неонозначности не было
 
A100:

Вы снова добавили неоднозначность

пока f была одна - неонозначности не было

Именно так! Сейчас могу обозвать f сразу много всяких функций и переменную. Должен же быть здравый смысл при таких неоднозначностях, чтобы не вызывать случайных ошибок. По-моему, логично обломать, выдав пустую строку на typename f, чем порождать проблемы, когда случайно взял и определил еще одну f.

 
fxsaber:

Именно так! Сейчас могу обозвать f сразу много всяких функций и переменную.

Так может такая возможность и есть источник скрытых ошибок?!

#ifdef __cplusplus
void f() {}
static char f; //Error: E2238 
#endif
 
A100:

Так может такая возможность и есть источник скрытых ошибок?!

Мне такая возможность нравится! Надо только осознавать, что делаешь.

 
fxsaber:

Кстати... IsStopped() возвращает bool

void OnStart()
{
        Print( typename( IsStopped())); //bool
        Print(           IsStopped() ); //0
        Print( typename( _StopFlag  )); //int
}

Это Print искажает результат (0 вместо false). В любом случае противоречие не (не только) в документации

https://www.mql5.com/ru/forum/1111/page1980#comment_5612130

 
fxsaber:

Именно так! Сейчас могу обозвать f сразу много всяких функций и переменную. Должен же быть здравый смысл при таких неоднозначностях, чтобы не вызывать случайных ошибок. По-моему, логично обломать, выдав пустую строку на typename f, чем порождать проблемы, когда случайно взял и определил еще одну f.

Не стоит так упорно везде искать здравый смысл, особенно среди багов.  А то вас послушать, так любой баг MQL - это вовсе и не баг, а фича, которую специально предусмотрели мудрые разработчики ))

Как уже было замечено, если есть сомнения, то первым делом надо проверить это в C++, и уже дальше плясать от этого.

Что касается неоднозначностей, то они должны вызывать ошибку компилятора и никаких проблем. А в примере A100 всё было чётко и однозначно, поэтому не очень понятно о чём вы.  Если появится необходимость перегрузить функцию - перегрузишь, исправишь ошибки компиляции в местах неоднозначностей, и всё.

 

Как в MQL сделать инициализацию статического члена шаблонного класса?

template<typename T>
class xxx
{
  static int value;
};

template <typename T>
int xxx<T>::value = -1;
 
Stanislav Korotky:

Как в MQL сделать инициализацию статического члена шаблонного класса?

Если прямо проблема, вынести в базовый нешаблонный класс и отнаследоваться. А вообще хз как.
 
Stanislav Korotky:

Как в MQL сделать инициализацию статического члена шаблонного класса?

template <typename T>
int xxx::value = -1;