错误、漏洞、问题 - 页 2682

 

MT5错误(build 2367)MQL中的模板函数执行优先级与C++中的不一致(在线:https://onlinegdb.com/B172m1PLL)
似乎作为bug 修复的一部分,编译bug被修复了,但重载模板函数的执行优先级仍然与C++行为不一致。

template<typename T>
struct B{
   T data;
};

template<typename T>
struct BB : public B<T>{};


template<typename T>                                             
struct A{
public:
   static void test(T& src){
      printf("1");
   }
   
   template<typename TT>
   static void test(B<TT>& src){
      printf("2");
   }
};

                                         
struct AA{
public:
   static void test(B<int>& src){
      printf("1");
   }
   
   template<typename TT>
   static void test(B<TT>& src){
      printf("2");
   }
};
      

void OnStart(){
   BB<int> bb;
   
   A<B<int>>::test(bb);         // MQL:2,  should be 1     
   AA::test(bb);                // MQL:2,  should be 1     
}
 

我遇到了一个有趣的问题。不可能将一个有多个类型参数的模板类型传递到一个宏中,因为预处理器不知道它处理的是一个模板,并且用逗号考虑参数。

我在SO 中找到了对问题的描述和对C++的解决方案。

#define  COMMA ,
#define  XYZ(type) {type ptr;}

XYZ(TemplatedType<A COMMA B>); // ошибка

我在MQL中试过,但不幸的是,它没有发挥作用。编译器对一个由传递的类型描述的变量给出了一个错误 "未声明的标识符"。

到目前为止,我用一个额外的派生类进行管理,但我是否可以像C++中那样进行修正?

哎呀。找到了一个解决方案。这就是它的工作方式。

#define  COMMA() ,
问题被删除。
Passing a template type into a macro
Passing a template type into a macro
  • 2017.05.30
  • bitmaskbitmask 22.3k1111 gold badges7070 silver badges133133 bronze badges
  • stackoverflow.com
I have a macro that takes a number of arguments, one of which is a type. For instance: If I try to instantiate this with a template type, say: This will not work as intended, as the pre-processor knows nothing of templates. It will...
 

MT5错误(build 2367)重载模板函数的位置会影响编译结果。
进行工作的原始票据 -https://www.mql5.com/ru/forum/1111/page2655#comment_15119627
C++在线(https://onlinegdb.com/BJzbH2DLL)


class input_iterator_tag  {};
class forward_iterator_tag       : public input_iterator_tag         {};
class bidirectional_iterator_tag : public forward_iterator_tag       {};
class random_access_iterator_tag : public bidirectional_iterator_tag {};


template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const  forward_iterator_tag*  tag){
   printf("2\r\n");
   return set_value(it, value, (input_iterator_tag*)NULL);                // 'set_value' - ambiguous call to overloaded function        
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const  bidirectional_iterator_tag*  tag){
   printf("3\r\n");
   return set_value(it, value, (forward_iterator_tag*)NULL);
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const random_access_iterator_tag* tag){
   printf("4\r\n");
   return set_value(it, value, (bidirectional_iterator_tag*)NULL);
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &val,  _Tp &value, const input_iterator_tag* tag){
   printf("1\r\n");
   return val;
};


template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it, _Tp &value){
   return set_value(it, value, it.tag);                        
};


template<typename T>
struct A{
   T data;
   static random_access_iterator_tag* tag;
};

template<typename T>
random_access_iterator_tag* A::tag = NULL;

class B{};


void OnStart (){ 
   A<B*> it;
   const B* const b_ptr = new B();
   set_value(it, b_ptr);                                      
   
   A<int> it_int;
   const int value_int = 5;
   set_value(it, value_int);         
}

int main(){
   OnStart();
   return 0;
};
 

模板函数/类缓存操作中的缺陷。
( 由MT5(build 2368)修复)***(up) 未定义行为,你创建了一个内部类型为 "C "的复杂包装对象,几次后发现它是一个完全不同的数据类型,也许是 "B",也许是 "int",随你怎么想。
( 由MT5(build 2368)修复)* 编译错误,传递函数指针作为const ref模板参数的错误。
( 由MT5(build 2368)修复)* 编译错误,B<int>对象可以在B<void*>对象之后创建,但如果在之前创建则会发生编译错误。


模板功能/类工作中的缺陷。
( 由MT5(build 2368)修复)***(up) 编译错误,模板函数内的bug,在显式类型转换 中传递的指针表现得像一个类,否则。
( 由MT5(build 2368)修复)**(up) 编译错误,在试图为模板函数的模板参数访问内部类时出现错误。
( MT5(build 2368)没有修复)***编译错误,主要的抱怨是一个不恰当的输出警告--"已废弃的行为,隐藏的方法调用将在未来的MQL编译器版本中被禁用"。 目前的实现是用羽毛拍鸟。
( MT5(build 2368)没有修复)** 编译错误,该错误涉及到模板函数的返回值,当返回值是模板类内部的一个类,其参数类型由模板函数的参数类型设定。
( MT5(build 2368)没有修复)** 编译错误,当继承和内部类中使用相同的类名时,调用基类的模板构造函数中存在命名空间和范围错误。
( MT5(build 2368)没有修复)* 编译错误,当从重载的非模板函数中调用具有明确参数类型的模板函数时出现错误。
( MT5(build 2368)没有修复) 编译错误,内部类定义的错误 - 在定义基类时没有引用全局命名空间。
( 由MT5(build 2368)修复)** 编译错误,使用内部类时模板类代码生成的错误。
( 由MT5(build 2368)修复)** 编译错误,模板方法/类的生成错误,模板参数的自动替换过程是在主程序代码的范围之外。
( 由MT5(build 2368)修复)* 编译错误,当模板类作为模板方法的返回值时,没有自动生成模板类代码的错误。
( 由MT5(build 2368)修复)* 编译错误,在向模板函数传递内部结构时出现错误,产生的数据类型 不能作为模板类中另一个内部结构的基础数据类型。
( 由MT5(build 2368)修复)* 编译错误,在模板类内声明模板函数时,没有对重复使用的模板类型名称进行检查,这导致了意外行为。
( 由MT5(build 2368)修复) 编译错误,当对象为模板类/结构时,与返回 "原地创建 "对象有关的多个缺陷。
(MT5(build 2368)没有修复)*(这不是一个bug,是一个特性)在基类构造函数中,在将基类对象的指针转换为父类的指针时,不可能进行显式类型转换。


与MQL与C++中调用重载函数的优先级不一致有关的缺陷。
( 由MT5(build 2368)修复)**(up) 编译错误,重载模板函数的调用优先级实际上取决于模板参数类型,这在理论上不影响编译结果。
( 由MT5(build 2368)修复)**(up) 当第一个重载的模板函数使用一个完全专业化的模板基类,而第二个使用一个非专业化的模板基类时,编译错误。
( MT5(build 2368)没有修复)** 编译错误,在为一个模板函数生成代码时发生了编译错误,尽管事实上有一个重载的模板函数,对所传递的参数有一个合适的签名。
( MT5(build 2368)没有修复)* 编译错误,当调用具有不同数量模板参数的重载模板函数时,"对重载函数的模糊调用"。
( 由MT5(build 2368)修复)*** 当继承类A <= B <= C <= D并实现两个重载函数,例如,一个有参数A*,第二个有参数B*,然后在MQL中的这种函数中传递一个对象C*或D*,会导致编译错误 "对重载函数的模糊调用"。
( 由MT5(build 2368)修复)** 运行时,调用超载模板函数的优先级不匹配。

与函数执行缓慢、代码优化器性能有关的缺陷。
( 由MT5(build 2368)修复)** 运行时,当使用ArrayResize一次向数组中添加一个元素时,尽管已经为它们预留了内存,但仍有很大的开销,例如,结构的速度最多可以慢7倍。


建议。
(新)链接--关于在类中静态方法的intellisense工作基础上实现命名空间功能的intellisense支持。
link- 允许字词和临时变量作为const ref函数参数传递。
link- 当在项目标签中移动 项目文件 时,对于被移动的文件,如果是在ME标签中打开的,要自动更新其位置路径。
link- 在MQL中引入typedef声明功能。
链接- 关于提供强制生成默认复制构造函数和赋值运算符的可能性。

 
MT5错误(build 2368)在模板类中继承时,当模板参数作为基类时,使用默认的访问修改器,出现编译错误。
以前一切都能正常工作,显然在修复其他错误的过程中,有些东西被打破了。

class A{};

template<typename T>
class B : T{};            //'A' - unexpected token      

template<typename T>
class BB : private T{};

   
void OnStart(){    
   BB<A> bb;      // Ok
   B<A> b;        // Compile Error: 
}
 

MT5错误(build 2368)通过明确的基类指示调用赋值语句时出现编译错误。 这个问题发生在以模板参数为基类的模板类中
它以前是有效的,显然是在修复其他错误的过程中出现了问题。

struct A{
   uchar data;
   void operator=(int n){
      printf("1");
   }
};

template<typename T>
struct B : public T{
   void operator=(int n){
      T::operator=(n);    //'operator' - undeclared identifier  
   }
};

   
void OnStart(){    
   B<A> b;        
   b = 0;
}
 
大家的MT5从2020年3月8日更新后,是否开始有跳空的交易记录
附加的文件:
 

关于交易、自动交易系统和交易策略测试的论坛

虫子、虫子、问题

fxsaber, 2020.03.22 10:04

mq5是可以的。mq4已经坏了。你可以从这里 获取TypeToBytes_ExampleScript.mq4。 只有当你把扩展名改为mq5时,它才能编译。

2368年--没有任何变化。

 

通过一个MT5终端,我可以随时登录到任何经纪人的账户。如果第一次登录出现问题,我只需使用终端的工具搜索相应的经纪人,自动获得其交易服务器的数据。此后,我可以顺利登录。


今天我第一次面临这样的情况(新的经纪人),没有任何帮助。我无法登录。在日志中写道。

2020.03.25 09:50:33.538  'xxx': no connection to XXX-Server


我已经下载了经纪人的本地终端--立即登录。我的研究终端--不可能。这是第一次出现这种情况。

你能告诉我如何使一个非本地终端能够连接到交易账户吗?

 
fxsaber:

你能告诉我如何使一个非本地终端能够连接到交易账户吗?

在mt4中,你需要把server.ini文件复制到另一个终端,这样你就不必再去寻找交易服务器了。

不知道在mt5中