此错误消息的含义是什么?
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;
}
答案 0 :(得分:20)
文字0
在C ++中有两个含义
一方面,它是一个值为0的整数
另一方面,它是一个空指针常量。
由于您的setval
函数可以接受int
或char*
,编译器无法确定您的重载次数。
最简单的解决方案是将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 int
或const 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)都将编译。
一般来说,首先要避开这种情况通常是一个好主意,不要使用类似类型定义重载函数。