1. ホーム
  2. c++

[解決済み】オーバーロードされた関数の呼び出しが曖昧になる

2022-02-10 01:38:36

質問

このエラーメッセージは何を意味しているのですか?

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 は、C++では2つの意味を持ちます。
一方は、値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*);
};