LINUX.ORG.RU

Вопрос по initializer_list

 


0

5

Добрый день!

Есть класс:

class Value
{
public:
	Value();
	Value(const std::string& value);
	Value(std::string&& value);
	Value(int value);
	Value(double value);
	Value(bool value);
	Value(const Array& value);
	Value(Array&& value);
	Value(const Value& rhs);
	~Value();
};

И есть другой класс:

class Array
{
public:
	Array(const std::initializer_list<Value>& values);
};

Если записать вот так:

Array a1({"one", "two", "three"});
Array a2({1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
Array a3({1.1, 1.2, 1.3, 1.4});
Array a4({true, false, true, false});
то все будет нормально компилироваться. А если добавить еще это:
Value v1({"one", "two", "three"});
Value v2({1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
Value v3({1.1, 1.2, 1.3, 1.4});
Value v4({true, false, true, false});
то v2, v3, v4 не скомпилируются. Компилятор ругается, что is ambiguous и перечисляет следующие конструкторы: Value::Value(Array&&), Value::Value(const Array&), Value::Value(std::string&&), Value::Value(const std::string&). Причем здесь вообще std::string, ведь там int, double и bool?

Изменил класс Value так:

class Value
{
public:
	Value();
	explicit Value(const std::string& value);
	explicit Value(std::string&& value);
	explicit Value(int value);
	explicit Value(double value);
	explicit Value(bool value);
	explicit Value(const Array& value);
	explicit Value(Array&& value);
	explicit Value(const Value& rhs);
	~Value();
};

Это привело к тому, что все перестало компилироваться: выдается сообщение: error: no matching function for call to ‘Array::Array(<brace-enclosed initializer list>)’.

В чем может быть проблема?


Ну так у тебя нет конструктора с initializer list для Value. explicit здесь не при чём. Не трогайте его здесь.

zamazan4ik ★★
()
Последнее исправление: zamazan4ik (всего исправлений: 1)

Причем здесь вообще std::string, ведь там int, double и bool?

Очень даже при том. Он тоже принимает std::initializer_list и компилятор не может выбрать между std::initializer_list<char> и std::initializer_list<Value>, так как это либо преобразование int, double или bool в char (указатели на char в char не преобразовываются, поэтому первая строка работает), либо конструирование Value, т.е. вес перегрузок одинаковый. Надо явно писать, что конструируется Array:

Value v2(Array{1, 2, 3, 4, 5, 6, 7, 8, 9, 10});

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

да, походу придутся так и делать. Спасибо!

silart
() автор топика

Лучше б ты скидывал diff, а то получается игра «найди 10 отличий»...

aido ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.