错误、漏洞、问题 - 页 2271

 
A100:
一个编译错误。

1)(2)和(3)(4)之间的根本区别是什么?

如果你在函数之外声明类(3)(4)--不会发生错误。如果你在一个函数内声明,会发生错误。

 
Vladimir Pastushak:

以下行为可能与什么有关

编译指标工作正常,再次编译指标不能正常工作。它在测试器中是否正常工作?

哪个指标?

 
fxsaber:

C++在这里产生了什么

为了使它在MQL5中工作,你需要在输出端有两个不同的字符串,而不是同一个。但这样一来,签名的形成机制应该是绝对不同的。如果C++ 在打印时产生相同的结果 ,__FUNCSIG__的成本将大幅下降。

结果:C++

void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )

正如你所看到的,字符串是不同的...使用的是函数签名

 
A100:

结果:C++

void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )

正如你所看到的,字符串是不同的...使用的是函数签名

MQL5给出了

void f<A>(A&)

也就是说,函数里面没有类的签名。有一天会得到支持。


而如果类是全局的,C++会产生哪一行?

void f<::A>( ::A& )

空白f<A>( A& )

 
fxsaber:

MQL5给出了

也就是说,函数里面没有类的签名。有一天会得到支持。

如果过时的C++编译器不支持它,它们已经在源代码 的第一行(1)给出了一个错误。这就是为什么问题首先是以这种方式提出的:为什么在一种情况下有错误,而在另一种情况下有正常的错误?

我们期望在这两种情况下有相同的行为:要么出错,要么没有错误。而错误不在于缺乏支持本身,而在于在其他平等条件下的不平等行为(如这个例子)。

 
fxsaber:
而如果类是全局的,C++会产生哪一行?

void f<::A>( ::A& )

空白f<A>( A& )

第二种变体

 
A100:

如果过时的C++编译器不支持这一点,它们已经在源代码 的第一行(1)给出了一个错误。这就是为什么问题首先是以这种方式提出的:为什么在一种情况下有错误,而在另一种情况下有正常的错误?

我们期望在这两种情况下有相同的行为:要么出错,要么没有错误。而错误不在于缺乏支持本身,而在于不平等的行为,其他方面都一样(如这个例子)。

嗯,这很容易解释。编译器从上到下穿过代码,在前进过程中形成相应的签名。第一个签名的创建没有任何问题。到了第二个,已经有了这样一个签名。这里我们在第二行有一个错误。

 
Georgiy Merts:

如果你在函数之外声明类(3)(4),不会发生错误。如果你在一个函数内声明,会发生错误。

如果在最初的例子
        class  A2 { int i; }; //(3)

换成

        interface  A2 {};      //(5)

如果你在一个函数内声明,也不会发生错误......根本的区别是什么?

 
fxsaber:

所以这是可以理解的。编译器从代码的顶部到底部,在前进过程中形成适当的签名。它创建了第一个签名,没有任何问题。它到了第二个,已经有一个了。因此,第二行有一个错误。

那么,为什么它在MQL中编译时没有错误?

template<typename T>
void f() { Print(__FUNCSIG__); }
void g1() { class A { int    x; } a; f<A>(); }
void g2() { class A { double x; } a; f<A>(); }
void OnStart()
{
        g1();
        g2();
}

结果: MQL C++

空白f<A>() void f<g1::A>()
空白f<A>() void f<g2::A>()

为什么签名是在这里创造的,没有任何干扰?

 
A100:

那么,为什么它在MQL中编译时没有错误?

结果: MQL C++

空白f<A>() void f<g1::A>()
空白f<A>() void f<g2::A>()

为什么签名是在这里创造的,没有任何干扰?

一个人只被创造。此外,在f中你不能使用T。总之,情况对我来说是很明显的。