MT5 (build 2059) Ошибка компиляции при передаче в шаблонную функцию параметра (void*)(NULL):
class C{
public:
template<typename T>
staticvoid func(T ){
Print(__FUNCSIG__);
}
};
voidOnStart(){
void* c_ptr = new C();
C::func((C*)NULL); // Ok
C::func(c_ptr); // Ok
C::func((void*)NULL); // 'void' - illegal use of 'void' typedelete c_ptr;
}
Все работало в (build 2057), возможно что-то поламалось в рамках исправления: # и # "Ошибка компиляции при выполнении type cast "самого в себя" для шаблонных классов и "сложных" структур".
К сожалению, на текущий момент возможности указателей на функции (function pointer types) в МТ4/MT5 весьма ограничены и не практичны из-за ряда дефектов: #(не исправлено в MT5(build 2060)) "Ошибка компиляции при повторном использовании одной и той же сигнатуры функции в рамках typedef". #(не исправлено в MT5(build 2060)) "При работе с typedef использование шаблонной функции с явной специализацией не вызывает генерацию кода этой шаблонной функции".
В виду ожидаемого внедрения пространства имен, прошу в рамках исправлений дефектов рассмотреть возможность внедрения поддержки следующего С++ подобного поведения:
//#include <iostream>template<typename T>
class A{
public:
typedefvoid (*callback)(T&); //class namespace for function pointer type
callback f_ptr;
T data;
};
template<typename T>
class B{
public:
typedefvoid (*callback)(T&); //class namespace for function pointer type
callback f_ptr;
};
template<typename T>
void func(T& value){
++value;
}
voidOnStart(){
//int main(){
A<int> a;
B<int> b;
a.f_ptr = func<int>; // automatic code generation of templates functions
b.f_ptr = a.f_ptr; // assignment operation for function pointers with the same function signatures and different function pointer types.int x = 1;
b.f_ptr(x);
printf("%d\r\n", x); //2printf("%d\r\n", b.f_ptr == a.f_ptr); //1 // equal operation for function pointers with the same function signatures and different function pointer types.
}
#property strictvoid Func( int &[] ) {}
void Func( int &[][2] ) {} // 'Func' - function already defined and has bodyvoidOnStart()
{
int Array1[];
int Array2[][2];
Func(Array1);
Func(Array2); // 'Array2' - invalid array access
}
В MT5 с этим нет проблем. В MT4 никак не получается перегрузить функцию.
Ошибка компиляции при передаче в шаблонную функцию параметра (void*)(NULL):
Все работало в (build 2057), возможно что-то поламалось в рамках исправления:
# и # "Ошибка компиляции при выполнении type cast "самого в себя" для шаблонных классов и "сложных" структур".
Еще в build 2056 все работало нормально. А в 2059 - уже ошибка при компиляции:
А если void заменить на A (*), то все нормально. А какая разница?
Более того - ошибка при компиляции возникает даже в этом случае:
При компиляции в командном build 2059x32 абстрактная ошибка:
но через IDE не воспроизводится - может и случайность
Как делаете выбор между использованием шаблонов и void* ?
Как делаете выбор между использованием шаблонов и void* ?
Какого то особого подхода нет, как то само собой выбирается на уровне интуиции
# (не исправлено в MT5(build 2060)) "Ошибка компиляции при повторном использовании одной и той же сигнатуры функции в рамках typedef".
# (не исправлено в MT5(build 2060)) "При работе с typedef использование шаблонной функции с явной специализацией не вызывает генерацию кода этой шаблонной функции".
В виду ожидаемого внедрения пространства имен, прошу в рамках исправлений дефектов рассмотреть возможность внедрения поддержки следующего С++ подобного поведения:
Привет! Обратите внимание на тему пожалуйста
https://www.mql5.com/ru/forum/314275
В двух словах, тестер расчитывает маржу, не соответствующую заданной в настройках символаФорум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Новая версия платформы MetaTrader 4 build 1170
fxsaber, 2019.05.28 12:10
Это ошибка MT4-компилятора?В MT5 с этим нет проблем. В MT4 никак не получается перегрузить функцию.