C++;算子重载解模糊 试图将一个古董C++代码库从GCC 3.2移到GCC 4.1,因为我遇到了一些问题。在所有的问题中,下面的内容让我感到无从(我想我花了太多时间在java上,或者我可能忘记了C++的基础知识:-P)。
我有一个模板类C++;算子重载解模糊 试图将一个古董C++代码库从GCC 3.2移到GCC 4.1,因为我遇到了一些问题。在所有的问题中,下面的内容让我感到无从(我想我花了太多时间在java上,或者我可能忘记了C++的基础知识:-P)。,c++,templates,gcc,C++,Templates,Gcc,我有一个模板类 template < class T > class XVector < T > { ... template < class T > T XVector < T >::getIncrement () { ... } template < class T > int XVector < T >::getValue (size_t index, T&a
template < class T > class XVector < T >
{
...
template < class T > T
XVector < T >::getIncrement ()
{
...
}
template < class T > int
XVector < T >::getValue (size_t index, T& value)
{
...
//The problematic line
value = (T) (first_value + getIncrement())
* (long) (index - first_index);
....
}
}
最后,我有另一个类,我们称它为build_breaker,它创建一个对象作为XVectora_变量代码>。现在,当我在gcc 3.2上编译它时,它编译起来没有任何问题。但是,当我尝试在GCC4.1上编译时,我在类XVector
中得到错误,称operator*
的ambigous重载,并且候选对象是
operator*(long int, long int)
operator*(int, long int)
operator*(long unsigned int, long int)
operator*(unsigned int, long int)
operator*(double, long int)
operator*(float, long int)
运算符*(长整型,长整型)
运算符*(整数,长整数)
运算符*(长无符号整数,长整数)
运算符*(无符号整数,长整数)
运算符*(双精度,长整型)
运算符*(浮点,长整型)
如果编译器说它在查找T*long的匹配项时遇到问题,那么这是有道理的,但是,为什么它要尝试将其类型转换为本机类型,然后执行算术运算呢?
请帮我做这个
提前感谢。我们需要知道什么是T。看起来您正在使用某种类型(例如无符号字符)实例化一个XVector,该类型可以转换为您看到的所有类型,编译器不知道选择哪一种。我们需要知道什么是T。看起来您正在使用某种类型(例如无符号字符)实例化一个XVector,该类型可以转换为您看到的所有类型,而编译器不知道选择哪一种。第二个操作数类型是long[int]
。第一个是TypeValue
,我想是这样,但是没有一个操作符*
接受这两个确切的类型。不过,该运算符还有许多其他类型组合,编译器可以通过对第一个操作数进行隐式转换来选择这些类型组合。该语言允许编译器这样做以尝试查找匹配项
但它应该在众多转换中选择哪一种?编译器无法选择int
是否优于long int
。(您可能会争辩说,由于第二个操作数是long int
,因此这应该是首选的转换目标,但实际情况并非如此。)
因此,有一些建议:首先,不要提供太多隐式转换。由于该类只能保存long
、double
和string
,因此我只提供了三种转换。仅此一项可能无法解决您的问题,但它可能会减少错误输出的大小,并使其他事情更易于管理
<> >而不是将<代码>(index -FistTyIndex)转换为<代码>长,考虑将其转换为类型<代码> t>代码>(即,<代码> TypeValue <代码>),因为这似乎是您真正想要执行的操作。 < P>第二个操作数类型是<代码>长[INT] < /代码>。第一个是TypeValue
,我想是这样,但是没有一个操作符*
接受这两个确切的类型。不过,该运算符还有许多其他类型组合,编译器可以通过对第一个操作数进行隐式转换来选择这些类型组合。该语言允许编译器这样做以尝试查找匹配项
但它应该在众多转换中选择哪一种?编译器无法选择int
是否优于long int
。(您可能会争辩说,由于第二个操作数是long int
,因此这应该是首选的转换目标,但实际情况并非如此。)
因此,有一些建议:首先,不要提供太多隐式转换。由于该类只能保存long
、double
和string
,因此我只提供了三种转换。仅此一项可能无法解决您的问题,但它可能会减少错误输出的大小,并使其他事情更易于管理
<> >而不是将<代码>(index -FistTyIndex)转换为<代码>长,考虑将其转换为类型<代码> t>代码>(即,<代码> TypeValue <代码>),因为这似乎是您真正想要执行的操作。 < P>我将将所有转换运算符更改为命名函数,以便:
operator long() const;
变成
long ToLong() const;
通过cast运算符隐式转换会导致各种问题,我自己的编程标准禁止使用它们。我会将所有转换运算符更改为命名函数,以便:
operator long() const;
变成
long ToLong() const;
通过cast运算符的隐式转换会导致各种问题,我自己的编程标准禁止使用它们。您的算术运算符应该接受并返回常量引用,因为它们是常量函数。赋值运算符应该接受const引用,但将方法本身设置为const没有多大意义;它是一个赋值运算符,所以它应该修改您调用它的内容。稍微更正一下,赋值运算符声明为它不是纯虚拟的,但有一个方法定义。不要在注释中“更正”它。通过编辑你的问题并使其正确,真正纠正它。当你这么做的时候,请记住我们以前从未见过“SdmsTypedValue”;这是你第一次提到这种类型。罗伯,我已经更新了代码。关于SdmsTypedValue,很抱歉。这就是复制和粘贴的效果。我想我需要提高我的代码审查技能。Niel&Gorpik建议有太多的隐式转换正在发生,并破坏了这场浩劫。我进一步检查了代码,发现操作符*与int和size_t一起用作右侧类型。如果一个类型被重载,那么其他引用在找到正确的调用时就会遇到问题。所以我必须为RHS上的所有类型重载操作符。虽然它解决了问题,但我不确定这是否是t的最佳解决方案