[過去ログ]
C++相談室 part165 (1002レス)
C++相談室 part165 http://mevius.5ch.net/test/read.cgi/tech/1698705458/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
772: デフォルトの名無しさん (ワッチョイ d963-lHAu) [sage] 2025/03/22(土) 20:51:53.87 ID:kbZO019Z0 質問なのですがstd::unique_ptr<T>とかstd::shared_ptr<T>みたいなSTLで定義済みの テンプレートクラスをfriendにすることは合法? 用途はシングルトンパティーンのオブジェクトのプログラム終了時の自動解放 http://mevius.5ch.net/test/read.cgi/tech/1698705458/772
774: デフォルトの名無しさん (ワッチョイ d963-lHAu) [sage] 2025/03/22(土) 22:33:09.97 ID:kbZO019Z0 >>773 ㌧クス、 >T のデストラクタが private なのを std::unique_ptr<T> からのアクセスは許すってこと? >特に問題ないよ。 それがTのコンストラクタがprivateなパティーンなのです! friendにしないとビルドが通らないかった(VS2022、VS2015)。 多分moveとかの最にstd::unique_ptr<T>がTのコンストラクタにアクセスするのだと思う。 http://mevius.5ch.net/test/read.cgi/tech/1698705458/774
775: デフォルトの名無しさん (ワッチョイ d963-lHAu) [sage] 2025/03/22(土) 22:39:33.53 ID:kbZO019Z0 >ところでテンプレートクラスじゃなくてクラステンプレートな! なるほど……orz コード例: class Foo { friend std::unique_ptr<Foo>; static std::unique_ptr<Foo> m_pObj; private: static Foo* createInstance() { if (m_pObj == NULL) { m_pObj = std::unique_ptr<Foo>(new Foo()); } return m_pObj.get()j; // ↑ std::make_unique<Foo>()したらビルドエラー(使うには多分std::make_unique<Foo>()もfriendが要る // スレッドセーフ化は省略 } // ... }; http://mevius.5ch.net/test/read.cgi/tech/1698705458/775
777: デフォルトの名無しさん (ワッチョイ d963-lHAu) [sage] 2025/03/22(土) 23:48:30.44 ID:kbZO019Z0 >>776 >new Foo() を Foo のメンバ関数の中でやる分には自分自身の中でやることなので friend 宣言は不要。 と思うじゃん? ↓現実 >friendにしないとビルドが通らないかった(VS2022、VS2015)。(>>774 エラーメッセージは熟読していませんぬが、 多分クラステンプレートの実体化がクラスのメソッド全部についてまとめて行われる的なことが起きて、 Tのコンストラクタにアクセスするstd::unique_ptr<T>のメンバ関数(moveコンストラクタとか)が引っかかるのだと予想 http://mevius.5ch.net/test/read.cgi/tech/1698705458/777
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
1.809s*