2016-01-29 44 views
2

我有两个类,A可以从string构建,因此定义了从stringA的转换。如何使用转换构造函数初始化矢量

class A 
{ 
    public: 

    A(std::string s) : s_(s) {} 

    private: 

    std::string s_; 
}; 


class B 
{ 
    public: 

    B() : v_{"foo", "bar"} {} 

    private: 

    std::vector<A> v_; 
}; 

B具有含有A对象vector构件。构造函数用字符串初始化矢量(v_)。这不起作用。为什么?

+0

请提供错误信息 – user463035818

+1

我会避免使用我的代码里面这样的隐式convertions做到这一点。它可能导致不可预知的结果。在你的'B'构造函数中,你甚至会期望2个隐式转换:首先是'const char *'到'std :: string',然后'std :: string'到'A'。 – Ternvein

回答

1

本质上,您的std::vector<A>预计将使用包含A对象的初始化程序列表构造。编译器不能隐式地将std::string对象的初始化程序列表转换为一个包含A的对象,并且其他std::vector构造函数都不需要两个std::string(即使构造函数有一个,它可能不会具有所需的含义) 。

如果你写

B() : v_{A("foo"), A("bar")} {} 

相反,它的工作原理。现在你有一个A的初始化列表,它被正确解释。

+0

或'v _ {“foo”,“bar”s}'。 –

1

C++不会执行传递转换。见the documentation here

用户定义的转换零个或一个非显式的单参数构造或非显式转换函数调用

重点矿。这样算下来,

vector<A>{"str"} 

当你实际请求转换序列

const char* --> std::string --> A 

由于有一个以上的转换存在,它不能编译。您只需要一个,以便为它工作,你可以通过发出

vector<A>{A("str")}