[解決済み] unique_ptrを使った前方宣言?重複
質問
と組み合わせてクラスの前方宣言を使用すると便利です。
std::unique_ptr
を組み合わせて使うと便利なことがわかりました。GCCでコンパイルして動くのですが、全体的になんだか変な感じで、これは標準的な動作なのでしょうか(つまり、標準が要求している)?Bは完全な型ではないので、私が
unique_ptr
.
A.hpp
#include <memory>
class B;
class A {
std::unique_ptr<B> myptr;
// B::~B() can't be seen from here
public:
~A();
};
A.cpp
#include "B.hpp"
//B.hpp has to be included, otherwise it doesn't work.
A::~A() = default; // without this line, it won't compile
// however, any destructor definiton will do.
これはデストラクタと関係があるのではないかと思います(そのため、デストラクタを呼び出すために
unique_ptr<B>
)が特定のコンパイル単位(A.cpp)で定義されていることです。
どのように解決するのですか?
明示的に合法です。 ルールは、標準ライブラリのテンプレートをインスタンス化するために使用する型は
は完全でなければなりません。
でない限り
でなければ
と指定されています。 の場合は
unique_ptr
の場合、§20.7.1/5に"[...] The template parameter T of unique_ptr may be incomplete type "とあります。
unique_ptrのテンプレートパラメータTは不完全な型である可能性があります。"
ポインタの操作には、完全な型が必要なものがあります。
特に、オブジェクトが実際に破壊されるとき(少なくともデフォルトのdeleterでは)
特に、オブジェクトが実際に破壊されるとき (少なくともデフォルトのデレッタで)。 あなたの例では、例えば、もし
A::~A()
がインラインであった場合、これは問題を引き起こすかもしれません。 (ただし、もしあなたが
デストラクタを自分で宣言しない場合は、インラインになることに注意してください。 これは
を使う目的を部分的に破ってしまいます。
std::unique_ptr
.)
関連
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み] フォワード宣言はどのような場合に使用できますか?
-
[解決済み] 関数からunique_ptrを返す
-
[解決済み】std::unique_ptr<T>はTの完全な定義を知るために必要なのでしょうか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】'cout'は型名ではない
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] C++でIncomplete Typeエラーが発生するのはどのような場合か
-
[解決済み】std::unique_ptr<T>はTの完全な定義を知るために必要なのでしょうか?