Синтаксис конструктора копирования C ++ shared_ptr - PullRequest
0 голосов
/ 20 ноября 2011

У меня есть следующий код C ++, который я пытаюсь получить для компиляции (соответствующие разделы приведены ниже). У меня проблемы с пониманием, что не так с моим синтаксисом.

Я получаю ошибку

C2664: A(const A&) : cannot convert parameter 1 from A *const to const A&

Насколько я понимаю, *b.getA() должен разыменовать указатель, давая мне фактический объект, который я затем смогу скопировать с помощью конструктора копирования.

class A: {
    public:
        A(const &A);
        A();
};

class B: {
    private:
        shared_ptr<A> myA;
    public:
        B() { myA = make_shared<A>(A()); }
        shared_ptr<A> getA() { return myA; }
};

main() {
    B b; // default constructor of B
    A a = *b.getA(); //try invoke copy constructor from A
    // Throws error C2664: A(const A&) : cannot convert parameter 1 from A *const to const A& 
}

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 20 ноября 2011

Ваш конструктор копирования неверен, он должен быть A(const A&), а не A(const &A).

Это прекрасно компилируется:

class A {
    public:
        A(const A&){}
        A(){}
};

class B {
    private:
        shared_ptr<A> myA;
    public:
        B() { myA = make_shared<A>(); }
        shared_ptr<A> getA() { return myA; }
};

main() {
    B b; // default constructor of B
    A a = *b.getA();
}
0 голосов
/ 20 ноября 2011

A(const &A); неверно. Есть две правильные и эквивалентные формы. Это

A(const A & /*name*/);
A(A const & /*name*/);
...