3

嗨,我正在尝试转发声明 cv::Mat 类,但我无法让它工作。它使消息字段“框架”具有不完整的类型

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

已声明但未定义的类、大小未知或元素类型不完整的数组是未完全定义的对象类型。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
}
于 2013-07-04T10:38:12.730 回答