2010-11-26 61 views
6
我有問題

:有初始值,但不完整的類型,而使用的結構:在HPP文件錯誤:初始化,但不完全類型

class A 
{ 
private: 
    struct videoDT; 
}; 

在CPP文件:

struct A::videoDT 
{ 
    videoDT(int b) : a(b){} 

    int a; 
}; 

void test() 
{ 
    struct videoDT test(1); 
} 

然後我有問題:

錯誤:有初始化但不完整類型

在此先感謝

+0

不應該是'struct A :: videoDT test(1);'? – codymanix 2010-11-26 17:36:50

回答

5

我認爲問題在於test()不能訪問A的私有類型。

這編譯對我來說:

class A 
{ 
private: 
    friend void test(); 
    struct videoDT; 
}; 

struct A::videoDT 
{ 
    videoDT(int b) : a(b){} 

    int a; 
}; 

void test() 
{ 
    A::videoDT test(1); 
} 
+0

我試過了,但它沒有幫助〜@ – olidev 2010-11-26 17:40:11

+0

@Joesy:我第一次誤讀了這個問題。看到修改後的答案。 – sbi 2010-11-26 17:41:20

0

當編譯器處理的文件.HPP,它需要推斷內存佔用和A級的佈局爲此,它需要知道結構videoDT的內存佈局。

錯誤是編譯器抱怨說它不知道struct videoDT是什麼,因爲你在.cpp文件中定義它。

要解決此錯誤,您需要在原始.hpp之前包含的.hpp文件中定義struct。另外,您也可以使用平普爾成語,改變class A到:

class A 
{ 
private: 
    struct videoDT* pVideoDT; 
} 

如果你這樣做,那麼你不再需要在頭文件中定義結構只是編譯類A.然而,PIMPL方法是一種先進的技術,我建議在決定使用它之前先閱讀它。

3

在你test函數聲明一個局部類型struct videoDT,但從來沒有定義它。不令人驚訝的是,編譯器抱怨初始化了不完整類型的對象。故事結局。

您是如何期待它的工作?如果您希望您的聲明使用A::videoDT類型,那麼您應該使用該類型的限定名稱 - A::videoDT - 因爲這就是所謂的類型。但是,代碼無論如何都不會編譯,因爲A::videoDTA中是私有的,而test無法訪問它。

換句話說,很難弄清楚你想要做什麼。提供一些更有意義的解釋或代碼。