错误、漏洞、问题 - 页 1965

 
fxsaber:

正是如此!现在我可以同时调用f各种函数和变量。这种模糊不清的地方必须有一些常识,以免造成意外的错误。在我看来,通过向typename f发出一个空字符串来欺瞒,而不是在你不小心拿起和定义另一个f时造成问题,这是合乎逻辑的。

不要这么固执地到处寻找常识,特别是在虫子中间。如果听你的,MQL中的任何bug根本就不是bug,而是明智的开发者所包含的功能 ))

正如已经指出的,如果你有任何疑问,首先要做的是在C++中检查,然后想出一个解决方案。

至于模棱两可的地方,应该会引起编译器错误,不会有问题。在样本A100中,一切都很清楚,毫不含糊,所以我不太明白你的意思。如果你需要重载一个函数,你就重载它,并修复歧义中的编译错误,就这样。

 

我如何在MQL中初始化一个模板类的静态成员

template<typename T>
class xxx
{
  static int value;
};

template <typename T>
int xxx<T>::value = -1;
 
Stanislav Korotky:

我如何在MQL中初始化一个模板类的静态成员

如果是一个直接的问题,把它带到一个非模板类的基础上,并继承它。一般来说,我不知道如何。
 
Stanislav Korotky:

我如何在MQL中初始化一个模板类的静态成员

template <typename T>
int xxx::value = -1;
 

A100:

template <typename T>
int xxx::value = -1;

当然,在一般情况下,这种方法不对应于C++,但它在MQL中是有效的。

我在班级外的方法上也遇到了类似的问题。

template<typename T>
class A
{
 public:
  void f();
};

template<typename T>
void A<T>::f() { }  //'A' - identifier already used

多亏了你,解决方案已经找到。

template<typename T>
void A::f() { }
当然这也是错误的,因为这意味着定义了一个模板方法,而不是模板类的方法。而如果一个班级同时包含这两种情况,就会出现模糊不清的情况
 
Alexey Navoykov:

我在课外取法时也遇到了类似的问题。

这就更方便了。唯一的限制是,你不能在中间有另一个类(像例子中那样)。

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

错误, 漏洞, 问题

A100, 2016.05.19 23:26

编译错误

template<typename T>
class A { public:
        bool operator==( const A& ); //error: 'operator' - function must have a body
        T t;
};
class B {
        A<int> a;
};
template<typename T>
bool A::operator==( const A& )  { return false; }
void OnStart()
{
        A<int> a, b;
        Print( a == b );
}
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2016.05.19
  • www.mql5.com
Форум алго-трейдеров MQL5
 
Alexey Navoykov:

因为它意味着定义一个模板方法而不是模板类方法。而如果该类包含这两方面的内容,就会出现模糊不清的情况

不会有歧义--一切都在我们面前想好了(c)。我们需要重复模板行两次(上面的将指代一个类,下面的指代一个方法)。
 
A100:
不会的--这一切都在我们面前想好了(c)。你必须重复模板行两次(上面的是指类,下面的是指方法)。

伙计,这看起来真的很混乱。

A100:
这样就更方便了。

是啊,不用放<T>就是这么严重的便利)。

 
Alexey Navoykov:

是的,不用放<T>是如此严重的便利。)

我的意思是,能够把一个方法放在类之外是很方便的。
 
Alexey Navoykov:

我在课外取法时也遇到了类似的问题。

当然是错的,因为这意味着定义了一个模板方法而不是模板类方法。而如果该类包含这两种情况,就会出现模糊不清的情况。

我注意到,方法经常被放在类之外,但为什么?我看了一下SB,所以 "小 "方法是在一行中一次性定义的,"长 "方法是在类之外定义的。没有感知上的便利,因为外部定义中的ALT+G提供的不是一个,而是两个过渡点。而如果有过载,则分别为2的倍数。而ALT+M已经可以一次性显示所有内容。

也许这是对界面定义的清晰度的某种致敬,但到目前为止,我还没有进入这个领域。