1

私はスマート ポインターは初めてで、すべてのつまずきにぶつかっている最中です。

私は構造体を持っていますtexture_t:

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

shared_ptrこの行を使用してこの構造体を作成しようとすると:

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

次のエラーが表示されます。

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

このエラーはどこから来て、どうすれば回避できますか?

4

2 に答える 2

4

のポイントは、パラメータで構築されstd::make_shared<T>(args...)たオブジェクトを割り当てることです。この操作の背後にある考え方は、2 つの割り当てられたオブジェクトを概念的に維持するというものです。Targs...std::shared_ptr<T>

  1. type へのポインターT
  2. std::shared_pt<T>現在のオブジェクトの数と、std::weak_ptr<T>オブジェクトを参照しているオブジェクトの数を追跡するレコード。

コンストラクターを構築する場合std::shared_ptr<T>、コンストラクターは 2 番目の割り当てを実行して、内部簿記用のレコードを構築します。std:make_shared<T>(args...)メモリ割り当てを 1 回だけ行います。

あなたが見たエラーは、 amandala::texture_tを使用して aを構築しようとした結果ですmandala::texture_t*が、コンストラクターが持つ唯一の引数mandala::texture_tはコピーコンストラクターです。ただし、ポインターはコピー コンストラクターへの引数として修飾されません。

于 2013-08-25T21:13:57.413 に答える