Visual Studio C ++ неоднозначный вызов перегруженной функции - PullRequest
0 голосов
/ 23 декабря 2011

Редактировать: я опубликовал весь класс (несколько полос для ошибки, не относящейся к делу)

Я создал следующий класс:

class packet
{public:char *  buffer;
    int     size;
    int     data;

    packet();
    packet(packet &text, int length=-1);
    packet(char * text, int length=-1);
    packet(int val);
    packet(char c);
    packet(double d);
    packet(float f);

    ~packet();

    packet &    operator=       (packet &text);
    packet      operator+       (packet &text);
    packet &    operator+=      (packet &text);
    packet &    operator|=      (packet &text);
    bool        operator==      (packet &text);
    bool        operator*=      (packet &text);
    bool        operator!=      (packet &text);

                operator char*  () const;
                operator int    () const;
                operator float  () const;
    char        operator []     (int pos)  const;
};

И я использую класс следующим образом:

    packet p = packet();

или

return packet();

И Visual Studio выдает мне эту ошибку:

test.cpp(162): error C2668: 'packet::packet' : ambiguous call to overloaded function
...packet.h(26): could be 'packet::packet(float)'
...packet.h(23): or       'packet::packet(int)'
...packet.h(22): or       'packet::packet(char *,int)'

Кто-нибудь знает, что я здесь не так делаю?Почему это неоднозначно?

PS: я думаю, что это связано с 4 операторами внизу, но я немного запутался с перегрузкой таких операторов ...

Решение: я заработал, отметив некоторые конструкторы как явные:

class packet
{public:char *  buffer;
    int     size;
    int     data;

    packet();
    packet(packet &text, int length=-1);
    explicit packet(char * text, int length=-1);
    explicit packet(int val);
    explicit packet(char c);
    explicit packet(double d);
    explicit packet(float f);

    ~packet();

    packet &    operator=       (packet &text);
    packet      operator+       (packet &text);
    packet &    operator+=      (packet &text);
    packet &    operator|=      (packet &text);
    bool        operator==      (packet &text);
    bool        operator*=      (packet &text);
    bool        operator!=      (packet &text);

                operator char*  () const;
                operator int    () const;
                operator float  () const;
    char        operator []     (int pos)  const;
};

1 Ответ

3 голосов
/ 23 декабря 2011

Если ошибка действительно возникает в том месте, где вы пытаетесь присвоить результат функции новой переменной, проблема может заключаться в вашем конструкторе копирования. Вы должны сделать packet& in const, чтобы его можно было использовать с временными объектами:

packet(const packet & text, int length=-1);

Другие конструкторы могут вступить в игру в этом случае, если ваш класс неявно преобразуется в int, float, ....

Из-за таких проблем обычно желательно не добавлять ненужные операторы преобразования и помечать конструкторы как explicit, чтобы избежать неожиданных неявных преобразований.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...