调用重载函数是不明确的

时间:2011-01-12 17:54:47

标签: c++ compiler-errors

此错误消息的含义是什么?

error: call of overloaded ‘setval(int)’ is ambiguous
huge.cpp:18: note: candidates are: void huge::setval(unsigned int)
huge.cpp:28: note:                 void huge::setval(const char*)

我的代码如下所示:

#include <iostream>
#define BYTES 8
using namespace std ;

class huge {
private:
    unsigned char data[BYTES];
public:
    void setval(unsigned int);
    void setval(const char *);  
};

void huge::setval(unsigned int t) {
    for(int i = 0; i< BYTES ; i++) {
        data[i] = t;
        t = t >> 1;
    }
}

void huge::setval(const char *s) {
    for(int i = 0; i< BYTES ; i++)
        data[i] = s[i];
}

int main() {
    huge p;
    p.setval(0);
    return 0;
}

6 个答案:

答案 0 :(得分:20)

文字0在C ++中有两个含义 一方面,它是一个值为0的整数 另一方面,它是一个空指针常量。

由于您的setval函数可以接受intchar*,编译器无法确定您的重载次数。

最简单的解决方案是将0转换为正确的类型 另一种选择是确保首选int重载,例如将另一个重载为模板:

class huge
{
 private:
  unsigned char data[BYTES];
 public:
  void setval(unsigned int);
  template <class T> void setval(const T *); // not implemented
  template <> void setval(const char*);
};

答案 1 :(得分:13)

如果我们考虑常量值的类型,解决方案非常简单,应该是“unsigned int”而不是“int”。

而不是:

setval(0)

使用:

setval(0u)

后缀“u”告诉编译器这是一个无符号整数。然后,不需要转换,并且呼叫将是明确的。

答案 2 :(得分:3)

使用以下内容替换p.setval(0);

const unsigned int param = 0;
p.setval(param);

这样就可以确定常数0的类型。

答案 3 :(得分:1)

使用

p.setval(static_cast<const char *>(0));

p.setval(static_cast<unsigned int>(0));

如错误所示,0的类型为int。这可以很容易地转换为unsigned intconst char *。通过手动进行强制转换,您可以告诉编译器您需要哪个重载。

答案 4 :(得分:1)

转换值,以便编译器知道要调用哪个函数:

p.setval(static_cast<const char *>( 0 ));

请注意,在编译之后,代码中存在分段错误(取决于您真正想要调用的函数)。

答案 5 :(得分:1)

这是不明确的,因为指针只是一个地址,因此int也可以被视为指针 - 0(一个int)可以同样容易地转换为unsigned int或char *。

简短的回答是调用p.setval(),其中明确指出了为其实现的类型之一:unsigned int或char *。 p.setval(0U),p.setval((unsigned int)0)和p.setval((char *)0)都将编译。

一般来说,首先要避开这种情况通常是一个好主意,不要使用类似类型定义重载函数。