Ошибка компиляции, когда shared_ptr <string>не инициализирован с использованием списка инициализаторов - PullRequest
0 голосов
/ 25 апреля 2020

В следующем коде pName_ был инициализирован внутри тела конструктора, который во время компиляции выдает ошибку как:

error: нет совпадения для вызова '(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;
}

1 Ответ

2 голосов
/ 25 апреля 2020

Вы пытаетесь использовать синтаксис списка инициализатора в теле конструктора - по сути, вы вызываете оператор () для pName_ с параметром строки, это не инициализирует ваш объект и является причиной ошибки компиляции .

Вы все равно должны предпочесть синтаксис списка инициализатора, поскольку это означает, что ваш член не будет создан по умолчанию, а затем отброшен и восстановлен телом вашего конструктора.

Для компиляции вам необходимо использовать операторы копирования или присваивания. Я также рекомендовал бы использовать make_shared вместо оператора new.

...