(Visual Studio 2010 사용) 내 프로젝트에서 기존 클래스의 shared_ptr을 만들려고합니다. 클래스는 std :: shared_ptr가 존재하기 전에 10 년 전에 작성되었습니다. 이 클래스는 다른 객체에 비 const 포인터를 사용합니다. 비어있는 매개 변수 생성자는 private입니다. 나는 그것에있는 shared_ptr을 만들려고 할 때shared_ptr을 만들려고 할 때 std :: make_shared()에서 오류가 발생 했습니까?
class Foobar {
public:
Foobar(Baz* rBaz);
private:
Foobar();
}
, 일이 잘되지 않습니다
VS2010에Baz* myBaz = new Baz();
std::shared_ptr<Foobar> sharedFoo = std::make_shared<Foobar>(new Foobar(myBaz));
이 그것을에 나타납니다 어떤 이유로 나에게
error C2664: 'Foobar::Foobar(const Foobar &)' : cannot convert parameter 1 from 'Foobar *' to 'const Foobar &'
3> Reason: cannot convert from 'Foobar *' to 'const Foobar'
을 제공합니다 Baz*
을 사용하는 생성자 대신 Foobar
의 복사 생성자를 호출해야합니다.
나는 cannot convert from 'Foobar *' to 'const Foobar'
부분에 대해서도 확신하지 못합니다. 나의 가장 좋은 해석은 템플릿 화 된 타입 shared_ptr<Foobar>
이 잘못되었다는 것입니다. 나는 그것을 shared_ptr<Foobar*>
으로 만들었지 만 이것은 틀린 것처럼 보였습니다. 필자가 본 모든 예제는 타입을 원시 포인터로 만들지 않습니다.
모든 것을 만들면 shared_ptr<Foobar*>
이 제대로 컴파일되지만, shared_ptr
이 범위를 벗어날 때 Foobar
개체가 올바르게 삭제되지 않도록 할 것입니까?
편집 :이이 관련된 것 같다,하지만 난 부스트 사용하지 않는 : 나는 make_shared()
을 사용하고 있는데 왜 내 실제 코드 sharedFoo
을에, 궁금해하는 경우, 명확하게하기 위해 : boost make_shared takes in a const reference. Any way to get around this?
Edit2가를 변수는 세 번째 클래스의 클래스 멤버입니다 (Foobar
및 Baz
과 무관).
atm은 테스트 할 수 없지만 그렇게해서는 안됩니다. std :: shared_ptr sharedFoo = std :: make_shared (myBaz); –
아! 그 트릭을 ... 분명히'make_shared()'당신을 위해 템플릿 형식의 생성자를 호출, 그래서 나는'new''ed 개체를 전달해서는 안됩니다. 감사! 다시 대답으로 말하면 올바른 것으로 표시합니다. –
완료, 직접 테스트 할 수있게 된 후 :) –