在下面的代码中,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。