2014-04-22 68 views
4

考慮下面的例子中的類的基類的構件時:錯誤使用嵌套在C++模板

template <typename T> 
struct A { 
    struct B { 
    int b; 
    }; 

    struct C : B { 
    void f() { 
     b = 0; 
    } 
    }; 
}; 

與GCC 4.8.1編譯它提供了以下錯誤:

test.cc: In member function ‘void A<T>::C::f()’: 
test.cc:9:11: error: ‘b’ was not declared in this scope 
      b = 0; 
     ^

但是,b是父類B(我在示例中使用struct來公開所有內容)的成員,並且如果我編制了A非模板,則所有內容都將編譯。

爲什麼編譯器給出這個錯誤,我該如何避免它?

回答

5

這是一種在語言一個不起眼的角落案件,但解決的辦法很簡單,限定它:

this->b = 0; // alternatively 'B::b = 0;' 

的原因是沒有資格b不是從屬名稱,它需要在實際類型被替換爲模板之前,在查找的第一遍中解析。此時,編譯器不知道是否可以爲將要實例化的類型專門設置A<T>::B,或者該專業化可能是否具有b成員。