Передача списка инициализатора в векторный конструктор - PullRequest
1 голос
/ 24 апреля 2019

У меня сейчас есть следующий код

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) не удалась? Любые предложения о том, как я могу решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 24 апреля 2019

Вам нужна другая пара скобок.Используйте:

0x0f, {{"A", "B", "C", "D"}}

Без этого компилятор пытается построить test, используя аргументы "A", "B", "C", "D", как если бы test{"A", "B", "C", "D"}, что не работает.

0 голосов
/ 24 апреля 2019

Это будет работать:

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