Информация об изменениях

Сообщение Re: Вопрос про конструкторы от 07.08.2019 12:55

Изменено 07.08.2019 12:59 sergii.p

Re: Вопрос про конструкторы
Здравствуйте, Videoman, Вы писали:

V>Есть код (прошу не спрашивать почему такой, это выжимка из большой библиотеки ):

V>
V>struct A
V>    {
V>        operator size_t() const;
V>        operator std::vector<std::string>() const;
V>    };

V>// Где-то ниже....

V>A a;
V>std::vector<string_t> v1 = a; // (1) ОК
V>std::vector<string_t> v2(a);  // (2) Error - Ambiguous...
V>


собственно проблема в том, что есть различные конструкторы vector. Один принимает std::vector<std::string> (конструктор копирования), другой принимает параметр size_t — количество элементов в векторе. a одинаково хорошо приводится как к первому так и ко второму. Поэтому vector и кричит об Ambiguous.

Чтобы убрать неоднозначность можно вызвать явно оператор, который вы хотите.
std::vector<string_t> v2(a.operator std::vector<string>())
или
std::vector<string_t> v2(a.operator size_t())
Re: Вопрос про конструкторы
Здравствуйте, Videoman, Вы писали:

V>Есть код (прошу не спрашивать почему такой, это выжимка из большой библиотеки ):

V>
V>struct A
V>    {
V>        operator size_t() const;
V>        operator std::vector<std::string>() const;
V>    };

V>// Где-то ниже....

V>A a;
V>std::vector<string_t> v1 = a; // (1) ОК
V>std::vector<string_t> v2(a);  // (2) Error - Ambiguous...
V>


собственно проблема в том, что есть различные конструкторы vector. Один принимает std::vector<std::string> (конструктор копирования), другой принимает параметр size_t — количество элементов в векторе. a одинаково хорошо приводится как к первому так и ко второму. Поэтому vector и кричит об Ambiguous.

Чтобы убрать неоднозначность можно вызвать явно оператор, который вы хотите.
std::vector<string_t> v2(a.operator std::vector<string>())
или
std::vector<string_t> v2(a.operator size_t())

p.s. Ну да. Почему собственно код (1) компилируется. Там объект vector уже существует и никаких конструкторов не вызывается. Вызывается оператор присваивания. Этот оператор присваивания size_t принимать никак не может. Поэтому тут неоднозначности не возникает