调用重载函数是不明确的

Bar*_*Das 22 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*)
Run Code Online (Sandbox Code Playgroud)

我的代码看起来像这样:

#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;
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*nau 21

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

由于你的setval函数可以接受a int或a 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*);
};
Run Code Online (Sandbox Code Playgroud)

  • `0`在C++中只有一个含义.它是`int`类型的整数文字.如果OP确实有一个带有`int`的重载而另一个带有`char*`的重载,则重载决策将成功并选择`int`重载.但是,OP使用`unsigned int`作为参数类型.那两个转换,`int` - >`unsigned int` vs null指针常量 - >`char*`是不明确的. (2认同)

Leo*_* L. 13

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

代替:

setval(0)
Run Code Online (Sandbox Code Playgroud)

使用:

setval(0u)
Run Code Online (Sandbox Code Playgroud)

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

  • 最佳答案,简单优雅的方式告诉编译器 (3认同)