2

次のように、一時的な unique_ptr で構築できるようにしたいクラスがあります。

MyCollection foo(std::unique_ptr<MyObj>(nullptr));

オブジェクトは、ポインターの所有権を取得する必要があります。私の質問は、これに対する正しいコンストラクターの署名は何ですか?

1. MyCollection(std::unique_ptr<MyObj> foo);
2. MyCollection(std::unique_ptr<MyObj>&& foo); 

最初のオプションはリンクしません。2 つ目はそうですが、これを使用して MyCollection を非 R 値で構築しようとするとどうなりますか? すなわち

std::unique_ptr<MyObj> pointer(nullptr);
MyCollection(pointer);

ここでの答え: unique_ptr 引数をコンストラクターまたは関数に渡すにはどうすればよいですか? unique_ptr を値で取得する必要があることを示唆していますが、上で述べたように、VS2010 ではリンクしません (エラーは次のようになります...

Error   5   error LNK2028: unresolved token (0A00075A) "private: __thiscall std::unique_ptr<class IVDSDocCore,struct std::default_delete<class IVDSDocCore> >::unique_ptr<class IVDSDocCore,struct std::default_delete<class IVDSDocCore> >(class std::unique_ptr<class IVDSDocCore,struct std::default_delete<class IVDSDocCore> > const &)" (??0?$unique_ptr@VIVDSDocCore@@U?$default_delete@VIVDSDocCore@@@std@@@std@@$$FAAE@ABV01@@Z) referenced in function "public: static void __clrcall std::unique_ptr<class IVDSDocCore,struct std::default_delete<class IVDSDocCore> >::<MarshalCopy>(class std::unique_ptr<class IVDSDocCore,struct std::default_delete<class IVDSDocCore> > *,class std::unique_ptr<class IVDSDocCore,struct std::default_delete<class IVDSDocCore> > *)" (?<MarshalCopy>@?$unique_ptr@VIVDSDocCore@@U?$default_delete@VIVDSDocCore@@@std@@@std@@$$FSMXPAV12@0@Z)  C:\sviluppo\FerrariGes\GesDB\VDS.NET\VDS\vdsdoc.obj

一部の回答は、移動機能を使用する必要があることを示唆しています。コンストラクター 1 を使用して、次のようなオブジェクトを作成しようとすると:

コンストラクター 1 を使用して、次のようなオブジェクトを作成しようとすると:

MyCollection foo(move(std::unique_ptr<MyObj>(nullptr)));

同じリンクエラーが発生します。

4

1 に答える 1

0

unique_ptr を値で受け入れる必要があるのは正しいですが、コピーできないため、コンストラクターに移動する必要があります。

MyCollection(std::unique_ptr<MyObj> foo);

//..
std::unique_ptr<MyObj> pointer(/*something*/);
MyCollection(std::move(pointer));

悪いことを編集してください。コンストラクターの最初の使用を読み過ぎていることに気付きました。

MyCollection foo(std::unique_ptr<MyObj>(nullptr)); 

もちろん、unique_ptr を値で取得するコンストラクターで動作するはずです。

ただし、リンカー エラーに記載されている関数シグネチャは、私には少し奇妙に見えます。

void __clrcall unique_ptr<X>::<MarshalCopy>(unique_ptr<X>*, unique_ptr<X>*)

だから多分それはまったく別の問題です。私は CLR にあまり詳しくないので、間違っていたらご容赦ください: C++/CLI で unique_ptr を使用していますか? それはサポートされていますか?内部で何をし<MarshalCopy>ますか - 生成されたもののように見えますが、移動のみのタイプでは機能しない可能性がありますか?

これは関連している可能性があります: C++/CLI で unique_ptr を使用する場合のリンカー エラー

于 2013-02-28T15:31:51.293 に答える