您好我正在尝试转发声明cv :: Mat类,但我无法让它工作。它会显示消息字段'frame'具有不完整类型。
OpenGlImpl.h。
namespace cv {
class Mat;
}
class OpenGLImpl {
private:
cv::Mat frame;
};
我应该如何正确地转发声明?
答案 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
}