前向声明 cv::Mat
Posted
技术标签:
【中文标题】前向声明 cv::Mat【英文标题】:Forward declaration cv::Mat 【发布时间】:2013-07-04 10:19:26 【问题描述】:您好,我正在尝试转发声明 cv::Mat 类,但我无法让它工作。它给出消息字段“框架”的类型不完整。
OpenGlImpl.h
namespace cv
class Mat;
class OpenGLImpl
private:
cv::Mat frame;
;
我应该如何正确转发声明?
【问题讨论】:
为什么#include您不能在此处使用前向声明。编译器需要有cv::Mat
的定义才能成为OpenGLImpl
的数据成员。
如果你想避免这个限制,你可以让OpneGLImpl
持有一个指向cv::Mat
的(智能)指针:
#include <memory>
namespace cv
class Mat;
class OpenGLImpl
private:
std::unique_ptr<cv::Mat> frame;
;
然后,您可以在实现文件中实例化 unique_ptr
拥有的 cv::Mat
。
请注意,引用也可以与前向声明一起使用,但您在这里不太可能需要引用语义。
【讨论】:
【参考方案2】:§ 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
【讨论】:
以上是关于前向声明 cv::Mat的主要内容,如果未能解决你的问题,请参考以下文章