2010-06-15 99 views
3

在一個標題文件,我已經向前聲明一個命名空間的兩個成員:C++:未知指針大小聲明時向前(錯誤C2036)

namespace Foo { 
    struct Odp 
    typedef std::vector<Odp> ODPVEC; 
}; 

class Bar 
{ 
public: 
    Foo::ODPVEC baz; // C2036 
}; 

由編譯器生成的錯誤是:

error C2036: 'Foo::Odp *': unknown size 

我猜這是一個正向申報Odp的問題。我怎樣才能解決這個問題?

+1

Foo命名空間中缺少分號是拼寫錯誤? – nevets1219 2010-06-15 00:44:06

+2

另請參閱[您可以使用前向聲明無法做到的事情列表](http://stackoverflow.com/questions/553682/when-to-use-for-forward-declaration/553869#553869)。 – 2010-06-15 00:44:18

+0

@ nevets1219是的,這是一個錯字 – 2010-06-15 00:45:19

回答

3

請勿轉發聲明Odp。編譯器不知道std::vector<Odp>的類型是什麼,因爲Odp尚未聲明。爲編譯器提供該類的完整聲明。

+0

但是如果我也想在其他地方宣佈它呢? – 2010-06-15 00:44:48

+0

@Rosarch:你可以在任何你想要的地方聲明這個類。你只能定義一次。將它定義在需要定義的任何地方。 – 2010-06-15 00:55:53

+0

沒錯,但我試圖避免在其他頭文件中包含頭文件。 – 2010-06-15 00:56:24

3

std::vector需要第一個模板參數的完整類型聲明,因爲它按值而不是指針存儲對象,因此需要了解對象大小。如果您存儲指針在矢量你可能會逃脫向前聲明,如:

class foo; 
typedef std::vector<foo*> foo_ptr_vec; 

的血淋淋的細節見the fine documentation