Можно ли устранить неоднозначность 0 (NULL) для нескольких конструкторов?а операторы присваивания? - PullRequest
1 голос
/ 13 октября 2011

В GCC более поздние версии.Как можно (если можно) устранить неоднозначность '0' или 'NULL', если у вас есть несколько конструкторов, которые принимают ссылки или указатели?

т.е.:

class XXX
{
public:
    XXX(const XXX &tocopy);
    XXX(const char *fromAString);
    XXX(const AnotherThing *otherThing);

    operator=(const XXX &tocopy);
    operator=(const char *fromAString);
    operator=(const AnotherThing *otherThing);
};

// nice not to have to cast when setting to NULL for 
// things like smart pointers and strings. Or items that can be initialized from 
// several types of objects and setting to null means "clear"

XXX anXXX = NULL;
anXXX = 0;

// In MSC one can have an 
//    XXX(const int &nullItem) { DEBUG_ASSERT(!nullItem); setnull(); } 
// and the overloads would be disambiguated.  GCC will cause a const int to conflict
// with pointer types.

1 Ответ

4 голосов
/ 13 октября 2011

C ++ имеет систему типов , поэтому переменные имеют типы, которые используются компилятором для разрешения перегрузки:

const char * p = 0;
const AnotherThing * q = 0;

XXX a(p), b(q); // uses the respective constructors for the static type of p, q

Если перегрузка неоднозначна, потому что вы этого не делаетеиспользуйте один из обязательных типов указателей, вы получите ошибку:

XXX c(0); // error: ambiguous
...