打字问题 - 页 3

 
Ilya Malev:

模板不匹配的错误可能应该在编译时发生。


但是在有一个数组对象的情况下

这样的错误不应该发生,因为在第一种情况下,Array[int]的调用被用作操作=的左参数,并且不是双倍类型 的变量,而在第二种情况下,它是右参数,并且左参数是双倍类型 的变量。

你没有听到,它不应该做任何事情--类型重载是被禁止的,而且在C++标准中明确写道(和μl作为C++类似--可能也是)。

Certain function declarations cannot be overloaded:

- Function declarations that differ only in the return type, the exception specification (18.4), or both
cannot be overloaded.

可能的原因已在上文解释。所以你的操作符[]是无效的。

 
pavlick_:

你没有听到,它不应该做任何事情--按类型重载是被禁止的,而且在C++标准中明确写明了。

我在上面给出的可能的原因。所以你的运算符[]是无效的。

我不是在回应你的标准,而是在回应基于常识的逻辑。你对 "可能的 "原因的定义并没有使我的论点失效。重载一个 类型操作 的可能性(包括隐含的)并不与你引用的标准相矛盾,因为重载的是将一个特定的显式定义的类型从上下文中转换出来的操作。

也许我说得不太清楚,但这一澄清希望能使它更清楚。


P.S. 当然,我虚构的代码与标准相矛盾。但如果你需要破译它(因为我在为自己琢磨如何更准确地表述这个问题),它应该是这样的。

class Array{

public:

Array *operator[] (int i){ id = i; return GetPointer( this ); }

double operator double(){ return data[i]; }

Array *operator=(double d){ data[id]=d; return GetPointer( this ); }

private:

double data[10];

int id;

};



int OnStart(){

  Array array;

  double d=123.456;

  array[5]=d;

  d=array[5];

}
 
如果你主张操作者类型(),很好。如果你主张从加号中缩进,那么我反对(允许按返回类型重载)来解决一些特殊的问题(可能可以用不同的方法解决,而且更漂亮--不知为什么,我从来没有像第一篇帖子中那样被扭曲)。
 
pavlick_:
如果你主张操作者类型(),很好。如果你主张从加号中缩进,那么我反对(允许按返回类型重载)来解决一些特殊的问题(肯定可以用不同的方式来解决,而且更漂亮--不知为什么,我从来没有像第一篇帖子中那样被扭曲)。

是的,最后,我都支持引入打字员。因为它正好解决了我在最初的帖子中所说的问题,只是以一种更 "传统"(符合标准,而且可能在一般情况下更正确)的方式。

 
Ilya Malev:

P.S. 当然,我捏造的代码是违反标准的。

为什么它与标准相抵触,它完全可以在加分项中有效。而且在麦克卢斯根本就没有码头。
 
pavlick_:
为什么它是矛盾的呢,在加号中它是相当有效的。而在mql中,根本就没有码头。

因为原本有两个相同的operator[]函数,但返回类型不同(我在第二个版本中修复了它)。这是标准所禁止的。并不禁止打字(隐含的也是),他们只是还没有时间来实现。考虑到mql5令人印象深刻的发展速度,我相信它迟早会被实施。特别是如果除了我之外还有人在论坛上关注它...

 
Ilya Malev:

因为有两个相同的operator[]函数,返回类型不同。这是标准所禁止的。并不禁止打字(甚至是隐性的),他们只是还没有时间来实现。考虑到mql5的巨大发展速度,我相信它迟早会被实施。特别是如果除了我之外还有其他人会在论坛上关注它......

我是说最后的代码--它很好。

 
pavlick_:

我的意思是最后的代码--它是好的。

这很好,但它在mql5中还不能工作。让我们关注并希望mql5的创新。正是这种无法充分实现数组对象的情况,因为无法像处理普通数组那样处理用户类型,所以长期以来一直困扰着我个人。当你自己制作阵列时,它从一开始就有缺陷,不具备与内置阵列相同的可用性。

 
Ilya Malev:

这很好,但它在mql5中还不能工作。让我们关注并希望mql5的创新。正是这种无法充分实现数组对象的情况,因为无法像处理普通数组那样处理用户类型,所以长期以来一直困扰着我个人。当你自己制作数组时,最初发现它是有缺陷的,没有内置数组那样的可用性。

好吧,我不指望有什么大的奇迹,这门语言并没有真正被开发出来,我怀疑他们会增加一个幽灵运算符。在这里,我特别强调的是不能这样做。

class Q {};

Q q;
// что то делаем и решаем переинициализировать q
q = Q();  // ошибка, нужно извратиться:

Q temp;
q = temp;

但我想,说了也没有用。

 
pavlick_:

好吧,我不指望有什么大的奇迹,这门语言已经不是真正的开发了,我怀疑他们会增加一个幽灵运算符。让我特别困扰的是,无法做到这一点。

但我认为,谈论它是没有用的。

现在还不太清楚问题出在哪里。难道对象的初始化不能在一个单独的方法中实现吗,比如Init(),甚至可以在一个虚拟的方法中实现?