Search code examples
c++compiler-errorsoverloadingoverload-resolution

Call of overloaded function taking unsigned int or a pointer is ambiguous when passing integer literal 0


What does this error message mean?

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*)

My code looks like this:

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

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

Solution

  • The literal 0 has two meanings in C++.
    On the one hand, it is an integer with the value 0.
    On the other hand, it is a null-pointer constant.

    As your setval function can accept either an int or a char*, the compiler can not decide which overload you meant.

    The easiest solution is to just cast the 0 to the right type.
    Another option is to ensure the int overload is preferred, for example by making the other one a template:

    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*);
    };