<string> 未使用初始值设定项列表初始化shared_ptr时出现编译错误



在下面的代码中,pName_已经在构造函数的主体中初始化,在编译过程中会抛出错误:

错误:对"(std::shared_ptr>((std:;string("*的调用不匹配

pName_(新字符串(名称((

但是,如果我通过使用initializers列表对其进行初始化来更改它的初始化方式,那么它就可以正常工作。为什么?

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

您正试图在构造函数的主体中使用initializer列表语法-本质上,您是在用字符串的参数调用pName_上的((运算符,这不会初始化您的对象,也是编译错误的原因。

无论如何,您应该支持initializer列表语法,因为这意味着您的成员不会被默认构造,然后被丢弃并由构造函数的主体重新构造。

若要编译,您需要使用复制运算符或赋值运算符。我还主张使用make_shared而不是operator new。

最新更新