#c #c 11 #uniform-initialization
#c #c 11 #единообразная инициализация
Вопрос:
В настоящее время у меня есть следующий код
class test
{
public:
test(std::vector<std::string> str)
{
}
test()
{
}
const std::multimap<int, std::multimap<int, test>> _var= {
{0x01, {
{
0x0f, {"A", "B", "C", "D"}
}
}
}
};
};
int main()
{
test t;
}
Ошибка:
main.cpp:29:9: error: could not convert '{{1, {{15, {"A", "B", "C", "D"}}}}}' from '<brace-enclosed initializer list>' to 'const std::multimap<int, std::multimap<int, test> >'
};
^
Я хотел знать, почему передача {«A», «B», «C», «D»} в std::vector<std::string> str)
не удается? Есть предложения о том, как я могу решить эту проблему?
Комментарии:
1. в чем ошибка?
2. хорошо, позвольте мне обновить
3. Происходит более 1 пользовательского преобразования. Исправьте это, выполнив
vector<string>{"A,","B","C"}
.
Ответ №1:
Вам нужна еще одна пара фигурных скобок. Использование:
0x0f, {{"A", "B", "C", "D"}}
Без этого компилятор пытается сконструировать a, test
используя аргументы "A", "B", "C", "D"
, как если бы test{"A", "B", "C", "D"}
, что не работает.
Комментарии:
1. @Rajeshwar, этот код мне нравится. Он отлично работает на моем компьютере.
2. Технически это приводит к сбою. Я только что опубликовал новый вопрос, основанный на этом
Ответ №2:
Это будет работать:
class test
{
public:
test(std::vector<std::string> str)
{
}
test()
{
}
const std::multimap<int, std::multimap<int, test>> _var= {
{0x01, {
{
0x0f, std::vector<std::string>{"A", "B", "C", "D"}
}
}
}
};
};
Тем не менее, вы никогда не должны передавать контейнеры по значению.
Альтернативный подход заключается в использовании std::initializer_list в вашем ctor, тогда ваш код может быть записан как:
class test
{
public:
test(std::initializer_list<std::string> str)
{
}
test()
{
}
const std::multimap<int, std::multimap<int, test>> _var= {
{0x01, {
{
0x0f, {"A", "B", "C", "D"}
}
}
}
};
};