2011-10-31 118 views
0

這段代碼有什麼問題? gcc 4.6.1抱怨「'foo'沒有在此範圍內聲明」in baz()。如果我轉換代碼以使其中一個模板只是一個普通類,問題就會消失。C++類模板繼承難題

struct Foo { 
    char foo; 
}; 

template<int N> 
struct Bar : public Foo 
{ 
    Bar() { foo; } 
}; 

template<int N> 
struct Baz : public Bar<N> 
{ 
    void baz() { foo; } 
}; 

int main() { 
    Baz<10> f; 
    return 0; 
} 
+2

我不明白你在做什麼 - Bar(){foo;}什麼是foo? – badmaash

+0

這被稱爲從屬名稱。請參閱http://womble.decadent.org.uk/c++/template-faq.html#base-lookup – Suma

+0

可能的重複[爲什麼不這C++模板代碼編譯?](http://stackoverflow.com/questions/1364837/why-doesnt-this-c-template-code-compile) – Suma

回答

1

什麼是錯的,根據規格,我不知道,但你可以通過使用使你的代碼編譯:

void baz() { Bar<N>::foo; } 
+6

什麼是錯誤的是,在編譯'Baz'時,它不知道_which_'Bar '是否可以繼承(稍後可能會有專門化),所以它還不知道有'foo'成員。通過驗證,你告訴它'''將有'foo'成員,直到'N'被知道之前不用擔心它。 –

+0

這也適用:「this-> foo;」 – Syncopated

1

foo是一個從屬名稱;也就是說,它依賴於模板參數,所以直到模板被實例化,編譯器才知道它是什麼。您必須明確表示它是班級成員,可以是Bar<N>::foothis->foo。 (你可能也想用它做一些事情;只是使用它作爲表達式的忽略值根本不會做任何事情)。