Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;算子重载解模糊 试图将一个古董C++代码库从GCC 3.2移到GCC 4.1,因为我遇到了一些问题。在所有的问题中,下面的内容让我感到无从(我想我花了太多时间在java上,或者我可能忘记了C++的基础知识:-P)。_C++_Templates_Gcc - Fatal编程技术网

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的最佳解决方案