2011-06-20 145 views
3

我始終知道,在C++中,只能使用具有引用或指針的forward聲明類。爲什麼如果我使用下面的forward聲明類作爲模板參數std::vector我在編譯期間沒有任何問題?將類聲明爲模板參數

感謝

AFG

// MyFile.hpp 
class OutClass{ 
public: 
     class InnClass; 
     OutClass(); 
     void print(); 

     // why this doesn't create compile time 
     std::vector<InnClass> m_data; 
}; 


// MyFile.cpp 
class OutClass::InnClass{ 
public: 
     InnClass() : m_ciao(0) {} 
     int m_data; 
}; 


OutClass::OutClass() 
: m_data(){ 
     InnClass a, b; 
     a.m_ciao=1; b.m_ciao=2; 
     m_data.push_back(a); 
     m_data.push_back(b); 
} 

void OutClass::print(){ 
     std::cout << m_data[0].m_ciao << std::endl; 
     std::cout << m_data[1].m_ciao << std::endl; 
} 


int main(int argc, char** argv){ 
     OutClass outObj; 
     outObj.print(); 
     return 0; 
} 
+0

什麼是您的編譯器和平臺? –

+0

我正在使用g ++/Linux –

回答

4

因爲也許的std::vector你的平臺上的具體實現不需要T是一個完整的。這對於vector來說相對容易,因爲它基本上只包含指針,因此如果正確的話不需要完整的類型。然而,對於std::vector,afaik標準要求T完整類型。所以,不要依賴那個。

+0

..mmhh ..可能是你幫助我需要看看std :: vector。非常感謝。 –