Ошибки, баги, вопросы - страница 2271
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ошибка при компиляции:
А какая принципиальная разница между (1)(2) и (3)(4) ???
Если объявлять классы (3)(4) вне функций - ошибок не возникает. Если объявить внутри функции - возникает.
C чем может быть связано следующие поведение
компилируешь индикатор работает правильно, компилируешь повторно индикатор работает не правильно. В тестере работает правильно ?
Какой индикатор?
Что выдает C++ здесь?
Чтобы это заработало в MQL5, нужно иметь на выходе две разные строки, а не одинаковые. Но тогда должен быть совсем иной механизм формирования сигнатур. Если же C++ выдает один и тот же результат на печати, тогда сильно падает цена __FUNCSIG__.
Результат: C++
void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )
Как видите строки разные... используется сигнатура функции
Результат: C++
void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )
Как видите строки разные... используется сигнатура функции
MQL5 выдает
void f<A>(A&)
Т.е. нет сигнатуры класса внутри функции. Когда-нибудь будет поддерживаться.
А если класс глобальный, то C++ какую из строк выдает?
void f<::A>( ::A& )
void f<A>( A& )
MQL5 выдает
Т.е. нет сигнатуры класса внутри функции. Когда-нибудь будет поддерживаться.
Если устаревшие C++ компиляторы не поддерживают это то они в исходном коде выдают ошибку уже на первой строке (1). Поэтому изначально вопрос так и ставился: Почему в одном случае ошибка, а в другом - нормально?
Ожидалось в обоих случаях одинаковое поведение: или ошибка или без ошибок. И ошибка не в отсутствии поддержки как таковой, а в неодинаковом поведении при прочих равных условиях (как и в этом примере)
А если класс глобальный, то C++ какую из строк выдает?
void f<::A>( ::A& )
void f<A>( A& )
Второй вариант
Если устаревшие C++ компиляторы не поддерживают это то они в исходном коде выдают ошибку уже на первой строке (1). Поэтому изначально вопрос так и ставился: Почему в одном случае ошибка, а в другом - нормально?
Ожидалось в обоих случаях одинаковое поведение: или ошибка или без ошибок. И ошибка не в отсутствии поддержки как таковой, а в неодинаковом поведении при прочих равных условиях (как и в этом примере)
Так объяснимо же. Компилятор идет сверху вниз по коду, формируя на ходу соответствующие сигнатуры. Первую сигнатуру создал без проблем. Доходит до второй - а такая уже есть. Вот и ошибка на второй строке.
Если объявлять классы (3)(4) вне функций - ошибок не возникает. Если объявить внутри функции - возникает.
заменить на
то и внутри функции ошибок не возникает... а какая принципиальная разница?
Так объяснимо же. Компилятор идет сверху вниз по коду, формируя на ходу соответствующие сигнатуры. Первую сигнатуру создал без проблем. Доходит до второй - а такая уже есть. Вот и ошибка на второй строке.
А так почему в MQL компилируется без ошибок?
Результат: MQL C++
void f<A>() void f<g1::A>()
void f<A>() void f<g2::A>()
Почему тут сигнатуры создаются без помех?
А так почему в MQL компилируется без ошибок?
Результат: MQL C++
void f<A>() void f<g1::A>()
void f<A>() void f<g2::A>()
Почему тут сигнатуры создаются без помех?
Одна только создается. Более того, в f Вы не сможете использовать T. В общем, ситуация очевидная для меня.