错误、漏洞、问题 - 页 2473

 
Sergey Dzyublik:


目前,不可能使用在模板类中声明的静态变量
随着名称空间的引入,这种限制是否可以被绕过?

是的,你可以。

代码将略有不同,更加正确,这里是一个例子。

//+------------------------------------------------------------------+
//|                                                  ScopeSample.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
class A
  {
public:
   struct Item
     {
      T                 value;
      
      Item(T initial=10):value(initial) { Print(__FUNCSIG__); }
     };

   static Item       s_default;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
class B
  {
public:
   struct Item
     {
      T                 value;
      
      Item(T initial=100):value(initial) { Print(__FUNCSIG__); }
     };

   static Item       s_default;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
A::Item A::s_default;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
B::Item B::s_default;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Print(A<int>::s_default.value);
   Print(B<int>::s_default.value);
  }
//+------------------------------------------------------------------+


结果。

2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) A<int>::Item::Item(int)
2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) B<int>::Item::Item(int)
2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) 10
2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) 100
 
非常酷,非常感谢你。
是否有可能获得具有命名空间支持的MT的alpha权限?
真的需要作为研究的一部分,能够编写一个 "智能容器",而不是寻找错误/漏洞等等。
 

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

虫子,虫子,问题

Sergey Dzyublik, 2019.05.23 13:52

我一直在与我的经纪人合作,我已经发现了MT中的十几个错误和 "特殊性"。
如何知道是否值得等待它们被修复?
请不要建议每次新版本出来时都测试所有东西。

(在MT5(build 2059)中没有修复)"当向模板函数传递(void*)(NULL)参数时出现编译错误"。
(在MT5(build 2059)中修复)"策略测试员:计划2次通过,但实际上由于 "OnInit critical error "错误,通过次数无限>900pc"。
(未在MT5(build 2059)中修复)"对于具有动态数组的结构,默认赋值运算符中的数组大小字段数值无效"。
(未在MT5(build 2059)中修复)"当从一个函数中按值返回一个类对象时,编译器没有看到默认的类复制构造器"。
(fix in MT5(build 2059))"编译器无法看到模式类和 "复杂 "结构 "本身 "的类型转换"。
(未在MT5(build 2059)中修复)"当使用typedef时,使用具有明确专业化的模板函数不会为该模板函数生成代码。
(未在MT5(build 2059)中修复)"在typedef中重复使用相同的函数签名时出现编译错误"
#
(未在MT5(build 2059)中修复)"很大一部分处理字符串的函数对字符串中的NULL字符不起作用(例如:ShortArrayToString, StringInit, StringFill)"。
(未在MT5(build 2059)中修复)"StringSetLength函数只用于 "修剪 "字符串的长度,而不是增加它。
#(固定在MT5(build 2057))"策略测试器:750个 "metatester64.exe "进程正在运行"。
"论坛www.mql5.com,当编辑带有图片的信息时,之前的图片不会被替换成新的"。


建议。
"允许用户强制生成/删除默认赋值运算符(复制构造器)的代码"。
"允许ArrayCopy复制类和 "复杂 "结构,类似于结构为任何对象类型提供深度复制功能的方式"。
"在使用动态数组时为用户提供读取/设置容量值的功能"。

"为改善信号服务的信息图而做出的改变"


 

今天在我的终端上,我的真实 期货市场账户(经纪人Otkritie)的tick历史没有被上传。

票据中的数据在变化。

现在是2019年5月24日23:40

该终端的最后一次打勾是在2019年5月23日。


其他一些工具的情况也一样,包括我自己交易的工具。

在第二个终端上(单独设置),在同一个经纪人的另一个账户上,效果是一样的。

 
你能分辨出专家是在优化模式 还是在单一测试模式 下工作吗?
 
MT5 (build 2059)
当向模板函数传递(void*)(NULL)参数时出现编译错误。
class C{
public:
   template<typename T>
   static void func(T ){
      Print(__FUNCSIG__);
   }
};


void OnStart(){  
   void* c_ptr = new C();
   
   C::func((C*)NULL);     // Ok
   C::func(c_ptr);        // Ok
   C::func((void*)NULL);  // 'void' - illegal use of 'void' type
   
   delete c_ptr;
}
在(build 2057)中一切都在工作,也许在修复过程中有些东西被搞砸了。
#"对模板类和 "复杂 "结构执行类型转换 "itself "时发生编译错误"。
 
也许通过与C++的类比,引入一个 "完全成熟的 "nullptr指针是有意义的?
 

早在Build 2056时,一切都运作良好。但在2059年,它已经出现了编译错误。

void OnStart()
{
class A {};
//#define void  A //(*)
        const void *p1;
              void *p2 = (void *)p1; //Error: 'void' - class type expected
}

而如果我们用A(*)代替void,则一切正常。这有什么区别呢?

此外,即使在这种情况下也会发生编译错误。

              void *p2 = (void *)p1; //Error: 'void' - class type expected
 

当在命令构建中编译时,2059x32抽象错误。

但没有通过IDE重现--可能是一个意外

 
A100:

你如何在使用模板和void*之间做出选择?