在下面的代码中,pName_
已在构造函数的主体内进行了初始化,在编译过程中其引发错误为:
错误:与“(std :: shared_ptr>)(std :: string )” *
的调用不匹配pName_(新字符串(名称));
但是,如果我通过使用初始化列表进行初始化来更改其初始化方式,则它可以正常工作。为什么?
class Person
{
public:
Person(string name) //: pName_(new string(name)){} /*UNCOMMENT THIS*/
{
pName_(new string(name));
}
void printName(){ cout<<endl<<*pName_; }
private:
shared_ptr<string> pName_;
};
int main()
{
vector<Person> persons;
Person p("George");
persons.push_back(p);
return 0;
}
答案 0 :(得分:2)
您正在尝试在构造函数的主体中使用初始化程序列表语法-本质上,您正在使用字符串参数在pName_上调用()运算符,这不会初始化您的对象,并且是编译错误的原因
无论如何,您都应该支持初始化程序列表语法,因为这意味着您的成员将不会被默认构造,然后被构造函数的主体丢弃并重新构造。
要进行编译,您需要使用复制或赋值运算符。我还将提倡在运算符new上使用make_shared。