前向声明cv :: Mat

时间:2013-07-04 10:19:27

标签: c++ opencv

您好我正在尝试转发声明cv :: Mat类,但我无法让它工作。它会显示消息字段'frame'具有不完整类型

OpenGlImpl.h。

namespace cv {
    class Mat;
}

class OpenGLImpl {

private:
   cv::Mat frame;

};

我应该如何正确地转发声明?

2 个答案:

答案 0 :(得分: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

请注意,引用也可以使用前向声明,但这里不太可能需要引用语义。

答案 1 :(得分:3)

§3.9.5

  

已声明但未定义的类,或未知大小或不完整元素类型的数组,是未完全定义的对象类型.43未完全定义的对象类型和void类型是不完整类型(3.9.1 )。 不得将对象定义为不完整类型。

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
}