c ++向量列表初始值设定项不适用于我的类的类型转换构造函数

时间:2016-07-19 14:35:15

标签: c++ boost vector

我创建了一个带有"类型转换构造函数的类" (采用不同类型的单个参数的构造函数)。我无法使用列表初始化语法来创建该类的向量。

在Boost Variant中包装我的类会以某种方式使同一个类使用类似的语法。

使用list initializer语法将我的类添加到向量中需要做的最小步骤是什么?

完整计划:

#include <boost/variant.hpp>
#include <iostream>
#include <string>
#include <vector>

using namespace std;
using boost::variant;

struct S {
  string s;
  S() {}
  ~S() {}
  S(const string& _s) : s(_s) {
    // Type converting constructor.
  }
};

int main() {
  // This works.
  S x{"abcd"};
  cout << "x: " << x.s << endl;

  // Why does this not compile?
  // I'm trying to create a vector with a single element in it.
  vector<S> vs{"vec_abcd"};

  // This works.
  vector<boost::variant<string>> vnts{"vnt_abcd0"};
  cout << "vec: " << boost::get<string>(vnts[0]) << endl;
}

2 个答案:

答案 0 :(得分:3)

您需要另一组花括号来使用std::initializer_list构造函数。

vector<S> vs{"vec_abcd"};

尝试构造具有const char[]参数的向量

vector<S> vs{{"vec_abcd"}};

另一方面,使用单个元素初始化列表初始化向量。看看它就像

vector<S> vs{{"vec_abcd"}};
            |^list data ^|
            ^ ctor call  ^

Live Example

此外,如果你想在向量中限制多个S,你可以使用

vector<S> vs{{"a"}, {"b"}, {"c"}, ..., {"z"}};

每个逗号分隔的内部大括号是针对向量中所需的每个S

答案 1 :(得分:1)

您正在尝试初始化vector,它具有类型为S(const string& _s)的构造函数const char *,并且符合C ++标准(SC22-N-4411.pdf)标题为“转换”的第12.3.4节

  

4最多一个用户定义的转换(构造函数或转换   function)隐式应用于单个值。

所以......

  1. 转换/转换const char *到std :: string vector<S> vs{ std::string("vec_abcd") }
  2. 初始化std::string,然后是向量。两级初始化需要两级间接和2级嵌套大括号初始化,如vector<S> vs{ {"vec_abcd"} }