嗨,我正在尝试转发声明 cv::Mat 类,但我无法让它工作。它使消息字段“框架”具有不完整的类型。
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
已声明但未定义的类、大小未知或元素类型不完整的数组是未完全定义的对象类型。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
}