[解決済み】std::unique_ptrが不完全な型だとコンパイルされない
2022-04-04 20:24:28
質問
pimpl-idiomを使用しています。
std::unique_ptr
:
class window {
window(const rectangle& rect);
private:
class window_impl; // defined elsewhere
std::unique_ptr<window_impl> impl_; // won't compile
};
しかし、不完全な型の使用に関して、コンパイルエラーが発生します。
<memory>
:
の適用が無効です。
sizeof
' を不完全な型 'uixx::window::window_impl
'
私が知っている限りでは
std::unique_ptr
は不完全な型でも使用できるはずです。これはlibc++のバグでしょうか、それとも私がここで何か間違ったことをしているのでしょうか?
解決方法を教えてください。
以下はその例です。
std::unique_ptr
を不完全な型とする。問題は破壊にあります。
でpimplを使用した場合
unique_ptr
デストラクタを宣言する必要があります。
class foo
{
class impl;
std::unique_ptr<impl> impl_;
public:
foo(); // You may need a def. constructor to be defined elsewhere
~foo(); // Implement (with {}, or with = default;) where impl is complete
};
というのも、そうしないとコンパイラはデフォルトのものを生成してしまうからで、完全な宣言が必要なのは
foo::impl
を使用します。
もし、テンプレートコンストラクタがあるのであれば、たとえ
impl_
メンバになります。
template <typename T>
foo::foo(T bar)
{
// Here the compiler needs to know how to
// destroy impl_ in case an exception is
// thrown !
}
ネームスペース・スコープでは
unique_ptr
もうまくいきません。
class impl;
std::unique_ptr<impl> impl_;
というのは、コンパイラはこの静的デュレーションオブジェクトをどのように破棄するかをここで知っていなければならないからです。回避策としては
class impl;
struct ptr_impl : std::unique_ptr<impl>
{
~ptr_impl(); // Implement (empty body) elsewhere
} impl_;
関連
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】std::unique_ptr<T>はTの完全な定義を知るために必要なのでしょうか?