Сообщение Re: Вопрос про конструкторы от 07.08.2019 12:55
Изменено 07.08.2019 12:59 sergii.p
Re: Вопрос про конструкторы
Здравствуйте, Videoman, Вы писали:
V>Есть код (прошу не спрашивать почему такой, это выжимка из большой библиотеки ):
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())
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>
собственно проблема в том, что есть различные конструкторы 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 принимать никак не может. Поэтому тут неоднозначности не возникает
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 принимать никак не может. Поэтому тут неоднозначности не возникает