【问题标题】:Passing an initializer list to a vector based constructor将初始化列表传递给基于向量的构造函数
【发布时间】:2019-04-24 19:18:26
【问题描述】:

我目前有以下代码

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&lt;std::string&gt; str) 会失败?关于如何解决此问题的任何建议?

【问题讨论】:

  • 什么是错误?
  • 好的让我更新
  • 您发生了超过 1 次用户定义的转化。通过 vector&lt;string&gt;{"A,","B","C"} 修复它。

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


【解决方案1】:

您需要另一副牙套。使用:

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

否则,编译器会尝试使用参数"A", "B", "C", "D" 构造test,就像test{"A", "B", "C", "D"} 一样,这不起作用。

【讨论】:

  • @Rajeshwar,该代码对我来说看起来不错。它在我的电脑上运行良好。
  • 这在技术上会导致崩溃。我刚刚发布了一个基于此的新问题
【解决方案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"}
                            }
                         }
                 }
        };   
};

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

另一种方法是在你的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"}
                            }
                         }
                 }
        };   
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    相关资源
    最近更新 更多