错误、漏洞、问题 - 页 2674

 

请提醒我,当你需要单独处理简单类型和指针时,是否有一个整洁的方法来解决 "对重载函数的模糊调用 "的错误,比如这样。

    template<typename V>
    void process(V value)
    {
    }

    void process(BaseFunctor *ptr)
    {
    }

这里,编译器认为(BaseFunctor *)也对应于V。你可以在调用方法时明确指定类型转换,但这很难看。如果你在模板函数中通过引用来获取参数,你不能传递常量和其他临时值(需要一个变量)。

 
Stanislav Korotky:
尝试添加一个带有链接的重载
 
TheXpert:
尝试添加一个带有引用的重载

你是指对象引用重载还是指针引用(似乎并不存在)?我不知道如何将一个指向分布式新实例的指针滑入一个对象引用中。

 
Artyom Trishkin:

你的周期对于平仓 是不正确的。做一个反向循环。

阿尔乔姆-特里什金

你的周期对于平仓 是不正确的。做一个反向循环。

我试试,但如果我们寻找的是同一方向的所有盈利头寸,如何循环不重要吗?反正我们会把所有的人都看一遍,并关闭必要的人。

 
Stanislav Korotky:

你是指用对象引用或指针引用(似乎不存在)进行重载吗?我不知道如何将一个指向分布式实例的指针滑入一个对象引用中。

有了一个对象参考。

我是这样想的。

class C {};

template<typename V>
void process(V value)
{
}

/* если добавить, компилируется
template<typename V>
void process(V& value)
{
}
*/

void process(C *ptr)
{
}
    
void OnStart()
  {
      C c;
      process(&c); // pointer, ok
      process(c); // 'process' - no one of the overloads can be applied to the function call       test2.mq5       32      7
  }
 
TheXpert:

与对象有关。

我是这样想的。

还是不那么直接,对不起;-)。该类是用于继承的。

class BaseFunctor
{
  public:
    virtual void process() = 0;
};

class MyFunctor: public BaseFunctor
{
  public:
    virtual void process() override
    {
    }
};

template<typename V>
void process(V value)
{
}

void process(BaseFunctor *ptr)
{
}

void process(BaseFunctor &ref)
{
}

void OnStart()
{
  process(new MyFunctor()); // 'process' - ambiguous call to overloaded function, could be one of 3 function(s)
}

如果你能创建一个BaseFunctor,它就能工作,是的。但事实并非如此。

 
Pavel Kozlov:

你好!

谢谢你报告这个错误!

能否请你详细说明一下图片的问题?

目前没有问题

 

下面的代码输出牖漠摲牥⁳湩潦〉〮र〲थ⸰〰歴沌┰〉〮र。

它应该输出测试的文本

这些文件在Files/Test/\文件夹中。

函数说句柄是正确的,它是1,并且立即GetLastError 说错误5008错误的句柄....。

我应该怎么做?

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   core();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+
void core()
  {
   string value = "", name = "";

   name =  "Test" + "\\test.csv";
   Print(FileIsExist(name));

   ResetLastError();

   int m_hendle = -1;
   m_hendle = FileOpen(name, FILE_READ | FILE_WRITE | FILE_CSV);
   if(m_hendle != INVALID_HANDLE)
     {
      Print((string)m_hendle + "    " + name + " [" + (string)FileSize(m_hendle) + "]"+ (string)GetLastError());
       while(!FileIsEnding(m_hendle))
        {
         string sCurrent = FileReadString(m_hendle);
         Print("sCurrent = ", sCurrent);
        }
      FileClose(m_hendle);
     }
  }
//+------------------------------------------------------------------+
 
Sergey Dzyublik:
非常讨厌的MT5(build 2316)错误,阻碍了进一步发展。
你创建了一个内部类型为 "C "的复杂包装对象,但结果却是一个相当不同的数据类型,可能是 "B"、"int",或者是你想要的任何类型...

我花了很多时间和精力才发现并了解到问题不在代码中,而是在MQL编译器中。(C++在线:https://onlinegdb.com/H1R1fR5ML)
据推测,问题出在模板类 "main_wrapper "缓存的工作中,在编译时,来自模板类 "A "的内部类 "internal_wrapper "被传递为不同数据类型(int, B*, B, C)的参数。
第一个数据类型是由模板类 "main_wrapper<A<TEMPLATE_TYPE>::internal_wrapper>"创建的,这样的数据类型将来会在模板的所有对象中进一步使用。


下面将提供另一个关于模板类代码生成的错误。

谢谢你的帖子,已修复

 
Vladimir Pastushak:

下面的代码输出牖漠摲牥⁳湩潦〉〮र〲थ⸰〰歴沌┰〉〮र。

它应该输出测试的文本

这些文件在Files/Test/\文件夹中。

函数说句柄是正确的,它是1,并且立即GetLastError说错误5008错误的句柄....。

我应该怎么做?

文件的编码是什么?