こんにちは、cv::Mat クラスを前方宣言しようとしていますが、うまく動作しません。メッセージフィールド 'frame' has incomplete type が表示されます。
OpenGlImpl.h
namespace cv {
class Mat;
}
class OpenGLImpl {
private:
cv::Mat frame;
};
これを適切に前方宣言するにはどうすればよいですか?
ここでは前方宣言を使用できません。コンパイラがcv::Mat
のデータ メンバーになるためには、 の定義が必要ですOpenGLImpl
。
この制約を回避したい場合は、へOpneGLImpl
の (スマート) ポインターを保持することができcv::Mat
ます。
#include <memory>
namespace cv {
class Mat;
}
class OpenGLImpl {
private:
std::unique_ptr<cv::Mat> frame;
};
その後、実装ファイルでcv::Mat
が所有するをインスタンス化できます。unique_ptr
参照は前方宣言でも機能しますが、ここで参照セマンティクスが必要になる可能性は低いことに注意してください。
§ 3.9.5
宣言されているが定義されていないクラス、または不明なサイズの配列または不完全な要素型の配列は、不完全に定義されたオブジェクト型です。オブジェクトは、不完全な型を持つように定義されてはなりません。
struct X; // X is an incomplete type
X* xp; // OK, xp is a pointer to an incomplete type.
struct Y
{
X x; // ill-formed, X is incomplete type
}
struct Z
{
X* xp; // OK, xp is a pointer to an incomplete type
}
void foo() {
// xp++; // ill-formed: X is incomplete
}
struct X { int i; }; // now X is a complete type
X x; // OK, X is complete type, define an object is fine
void bar() {
xp = &x; // OK; type is “pointer to X”
}
void t()
{
xp++; // OK: X is complete
}