2013-07-04 4 views
2

Привет Я пытаюсь переслать декларацию класса cv :: Mat, но я не могу заставить его работать. Он дает сообщение Поле 'frame' имеет неполный тип.Передовая декларация cv :: Mat

OpenGlImpl.h

namespace cv { 
    class Mat; 
} 

class OpenGLImpl { 

private: 
    cv::Mat frame; 

}; 

Как я должен правильно вперед declarate это?

+0

Почему не #include работы? – ChronoTrigger

+0

#include "opencv2/core/core.hpp" – banuj

+2

Вы не можете перенаправлять объявляемую переменную-член (или базовые классы), поскольку она влияет на размер вашего класса. Вы можете использовать вещи как указатели и т. Д., Которые не повлияют на размер – doctorlove

ответ

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 в файле реализации.

Обратите внимание, что ссылка также будет работать с объявлением вперед, но вам вряд ли нужна семантика refernce.

3

§ 3.9.5

Класс, который был объявлен, но не определен, или массив неизвестного размера или неполного типа элемента, является неполностью определенный объект type.43 неполностью определенные типы объектов и типы пустот являются неполными типами (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 
} 
Смежные вопросы