2013-07-04 56 views
2

嗨我想轉發聲明cv :: Mat類,但我不能讓它工作。它給出的消息字段「框架」有不完整的類型正向聲明cv :: Mat

OpenGlImpl.h

namespace cv { 
    class Mat; 
} 

class OpenGLImpl { 

private: 
    cv::Mat frame; 

}; 

我應該如何正確地轉發declarate呢?

+0

爲什麼不#包括工作? – 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; 

}; 

然後,您可以實例化一個實現文件由unique_ptr擁有的cv::Mat

請注意,引用也可以與前向聲明一起使用,但在這裏您不太可能需要引用語義。

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 
}