将初始化列表传递给基于向量的构造函数

时间:2019-04-24 19:18:27

标签: c++ c++11 uniform-initialization

我目前有以下代码

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 个答案:

答案 0 :(得分:3)

您需要另外一对牙套。使用:

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

否则,编译器将尝试使用自变量test来构建"A", "B", "C", "D",就像test{"A", "B", "C", "D"}一样。

答案 1 :(得分:0)

这将起作用:

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

尽管如此,您永远不要按值传递容器。

另一种方法是在ctor中使用std :: initializer_list,然后将代码编写为:

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