不完全型的我有彼此依賴兩類:無效使用對於g ++
class Foo; //forward declaration
template <typename T>
class Bar {
public:
Foo* foo_ptr;
void DoSomething() {
foo_ptr->DoSomething();
}
};
class Foo {
public:
Bar<Foo>* bar_ptr;
void DoSomething() {
bar_ptr->DoSomething();
}
};
當我編譯它以g ++,它被給予的「無效使用不完整的類型的」錯誤,但它是在MSVC 10中很好地編譯。 在將聲明和定義保留在一個頭文件中的同時,是否可以解決這個問題? (沒有cpp文件) 如果標準中不允許這樣做,那麼這個MSVC的「錯誤」或「特徵」也是如此?
順便說一句,在Linux上編譯很好。在類聲明的末尾添加分號之後,您是否嘗試將實現移動到cpp文件並在頭中留下聲明?由於Foo和Bar互相引用,會調用DoSomething創建無限循環嗎? – stefanB 2010-02-17 01:19:58
我使用g ++ 4.4.1,它給出錯誤:不完整類型'struct Foo'的無效使用。請不要介意無限循環,我錯誤地讓他們調用相同的方法,但我們可以考慮Foo和Bar類有其他方法。 – leiiv 2010-02-17 01:26:27
G ++是正確的:'DoSomething'是一個非依賴名稱,因爲限定符'foo_ptr->'中沒有任何內容會使其依賴於模板參數。因此,必須查看模板定義時間(但當時,「DoSomething」尚未聲明)。取而代之的是在實例化時間查找相關名稱。由於MSVC++編譯器沒有實現這種兩階段查找,因此它不會在程序中檢測到此錯誤。 – 2010-02-18 15:04:37