3

こんにちは、cv::Mat クラスを前方宣言しようとしていますが、うまく動作しません。メッセージフィールド 'frame' has incomplete type が表示されます。

OpenGlImpl.h

namespace cv {
    class Mat;
}

class OpenGLImpl {

private:
   cv::Mat frame;

};

これを適切に前方宣言するにはどうすればよいですか?

4

2 に答える 2

9

ここでは前方宣言を使用できません。コンパイラが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

参照は前方宣言でも機能しますが、ここで参照セマンティクスが必要になる可能性は低いことに注意してください。

于 2013-07-04T10:20:59.457 に答える
3

§ 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
}
于 2013-07-04T10:38:12.730 に答える