错误、漏洞、问题 - 页 2653

 
Vladimir Simakov:

嗯,STL不是一个一刀切的解决方案。在这里,你必须非常注意具体细节。

你把柔软和温暖混淆了。
这不是一个STL的问题。我自己会在那里想办法的...(如果有人不具备,并不意味着原则上不能做)

最简单的方法是在基类或接口中用抽象方法实现所有可能的功能,而在子类中--要么实现要么=delte。
在这种情况下,你需要向基类的方法传递相同类型的指针或引用。
虽然在虚拟表的形式上有一个不可避免的弊端,但最好是以这样的方式安排架构,即在任何地方都没有通过dynamic_cast的昂贵分支。

你建议的方法早先就已经实现了,而且也取决于同一个错误:https://www.mql5.com/ru/forum/1111/page2648#comment_15015191


该错误是在对指针/类参数进行隐式类型转换时,调用重载函数的优先级。
在C++中一切正常,但在MQL中却出现了编译错误"对重载函数的模糊调用 "
上面建议了一种变通的方法,但它很大,而且不方便,我也不想把它用于十几个类似的函数。
也许有更简单的东西?

 
Macros做了他们的工作,设法将画布 还原成形式(完整版本在附件文件中)。
//+------------------------------------------------------------------+
//|  MQL realization                                                 |
//+------------------------------------------------------------------+
#ifdef __MQL5__
   template <typename _InputIter>
   CREATE_MISSED_ITERATOR_FUNCTION_FW_P2(int, distance, _InputIter&, _InputIter&);
   
   template <typename _InputIter>
   CREATE_MISSED_ITERATOR_FUNCTION_RA_P2(int, distance, _InputIter&, _InputIter&);

   template <typename _InputIter>
   CREATE_MAIN_ITERATOR_FUNCTION_P2(int, distance, _InputIter&, _InputIter&, _InputIter);
   
   void OnStart(){
      MyIterator it1(1);
      MyIterator it2(5);
      printf("result:%d", distance(it1, it2));            
   }
#endif 

开发人员,请告知,是否有任何计划来修复这个错误,或者这在架构上是不可能的?
附加的文件:
 
Bug MT5(build 2323)。
在模板函数中,在显式类型转换 中传递的指针表现得像一个类,相应地引起编译时的错误。
#define  PRINT(x) ; Print(#x, ":", string(x))

template<typename T>
class ClassWrapper{
public:
   T data;
};

class ClassA{};
class ClassB : public ClassA{};


template<typename T, typename TT>
void func(const T &_wrapper, const TT &value){
   T wrapper = _wrapper;   
   
   PRINT(typename(wrapper.data));         // Ok: ClassA*
   PRINT(typename(value));                // Ok: ClassA*
   PRINT(typename(TT));                   // Ok: ClassA*
   
   //wrapper.data = (TT)(value);          // Compiler Error: 'value' - object required  
   //wrapper.data = (TT)(wrapper.data);   // Compiler Error: 'data' - object required   
   
   ClassB b;
   PRINT(typename((TT)(b)));              // Result: C lassA. During explicit type conversion, TT is "ClassA" instead of "ClassA*"
};


void OnStart(){
   ClassWrapper<ClassA*> a_ptr_wrapper;
   
   ClassA a;
   const ClassA* a_ptr = &a;
   func(a_ptr_wrapper, a_ptr);
};
 

笨,不能解决一个简单的问题。我需要了解的是,在以下EA启动设置期间,禁止交易


这个检查不起作用。

int OnInit()
{
  Alert(AccountInfoInteger(ACCOUNT_TRADE_EXPERT) &&
        AccountInfoInteger(ACCOUNT_TRADE_ALLOWED) &&
        TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)); // true
        
  return(INIT_FAILED);
}


OrderCheck是一个红鲱鱼。请告知。

 
bool CheckTradingPermission()
  {
//--- Для режима реального времени
   if(IsRealtime())
     {
      //--- Проверка соединения с сервером
      if(!TerminalInfoInteger(TERMINAL_CONNECTED))
         return(false);
      //--- Разрешение на торговлю на уровне данной запущенной программы
      if(!MQLInfoInteger(MQL_TRADE_ALLOWED))
         return(false);
      //--- Разрешение на торговлю на уровне терминала
      if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
         return(false);
      //--- Разрешение на торговлю для текущего счета
      if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
         return(false);
      //--- Разрешение на автоматическую торговлю для текущего счета
      if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
         return(false);
     }
//---
   return(true);
  }
ANATOLI KAZHARSKI 代码

Anatoli Kazharski
Anatoli Kazharski
  • www.mql5.com
Опубликовал статью ZigZag всему голова (Часть II): Примеры получения, обработки и отображения данных В первой части был описан модифицированный индикатор ZigZag и класс для получения данных индикаторов такого типа. Теперь мы покажем как создать индикаторы на основе этих инструментов, а также напишем эксперта для тестов, который будет заключать...
 
Fast235:
ANATOLI KAZHARSKI 代码

谢谢,没有注意到MQL_TRADE_ALLOWED。

 
fxsaber:

笨,不能解决一个简单的问题。我需要了解的是,在以下EA启动设置期间,禁止交易


这个检查不起作用。


OrderCheck是一个红鲱鱼。请告知。

我在手机上不确定,但这里是:MQL_TRADE_ALLOWED
 
Bug MT5(build 2323),同一个模板对象B<int>可以在B<void*>类的对象之后创建,但如果在之前创建,会发生编译错误
原因可能是模板类生成器缓存的工作。

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

void OnStart (){ 
   //B<int> b_int_0;    // Compiler Error  'void' - unexpected token, probably type is missing?
   B<void*> b;          // OK
   B<int> b_int_1;      // OK
}
 

Bug MT5(build 2340)使用了两次相同的代码:第一遍 - 编译成功,第二遍 - 编译错误
显然
问题与模板函数生成器缓存有关。
如果模板函数 "
void run(const T &ff)" 的引用转移被"void run(const T ff)"的值转移所取代,错误就会消失

void func(){
}

template<typename T>
void run(const T &ff){
   ff();
}

void OnStart (){ 
   {
      typedef void(*f_ptr)();
      f_ptr ff = func;
      run(ff);             // OK
   }
   {
      typedef void(*f_ptr)();
      f_ptr ff = func;
      run(ff);            // Compile Error: 'ff' - parameter conversion not allowed     
   }
}
 

Bug MT5(build 2340)当试图访问模板函数的模板参数的内部类时出现编译错误

class B{
public:
   class C{};
};


// Bypass Compile Error
template<typename T>
class GetClassType{
public:
   class type : public T{};
};


template<typename T>
void func(const T &b){
   T::C* c_ptr = new T::C;          // Compile Error: 'T' - struct undefined    
   
   // Bypass Compile Error
   GetClassType<T>::type::C* c_ptr_bps = new GetClassType<T>::type::C();
};

void OnStart (){ 
   B b;
   func(b);
}