Передача списка инициализаторов в векторный конструктор

#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"}
                            }
                         }
                 }
        };   
};