2013-08-25 7 views
1

저는 스마트 포인터가 생소하고 모든 걸림돌을 치고 있습니다. 나는 시도하고이 줄을 사용하여이 구조체의 shared_ptr을 할 때shared_ptr을 생성하는 중 문제가 발생했습니다.

struct texture_t 
{ 
    hash32_t hash; 
    uint32_t width; 
    uint32_t height; 
    uint32_t handle; 
}; 

:

error C2664: 'mandala::texture_t::texture_t(const mandala::texture_t &)' : cannot convert parameter 1 from 'mandala::texture_t *' to 'const mandala::texture_t &' 

:이 오류가

auto texture_shared_ptr = std::make_shared<texture_t>(new texture_t()); 

나는 구조체 texture_t이 이 오류는 어디서 발생하며 어떻게 피할 수 있습니까?

답변

2

ed 포인터를 std::make_shared에 전달하면 안됩니다. texture_t이 생성 될 수있는 인수를 전달하면됩니다.

+0

매력처럼 작동합니다. 감사합니다. 이게 내가 생각한 것보다 똑똑한 것 같아! –

4

std::make_shared<T>(args...)의 점은 으로 구성된 T 개체를 할당하는 것입니다.

  1. 포인터가 T를 입력 할 :이 작업 뒤에 아이디어는 std::shared_ptr<T>는 개념적으로 두 개의 할당 된 객체를 유지하는 것입니다.
  2. 개체를 참조하는 현재 std::shared_pt<T> 수와 std::weak_ptr<T> 수를 추적하는 레코드입니다.

을 생성 할 때 생성자는 두 번째 할당을 수행하여 내부 장부 보관을위한 레코드를 생성합니다. std:make_shared<T>(args...)은 하나의 메모리 할당 만 수행합니다.

mandala::texture_t*을 사용하여 mandala::texture_t을 생성하려고 시도했지만 단 하나의 인수 생성자 mandala::texture_t이 복사 생성자입니다. 그러나 포인터는 복사 생성자에 대한 인수로 한정되지 않습니다.

관련 문제