2017-04-11 41 views
1

Demo無法沒有明確範圍

模板類具有靜態構件foo訪問模板基類的靜態成員。

template <typename... T> 
struct A { 
    static constexpr bool foo = true; 
}; 

試圖訪問foo的templaed派生類。

template <typename... T> 
struct B : A<T...> { 
    void yo() { 
     std::cout << foo << '\n'; 
    } 
}; 

這失敗了。誰能解釋爲什麼?我可以通過直接訪問它來解決它,如A<T...>::foo但如果B有自己的靜態變量隱藏foo?

如果第三方/主要只通過模板知道A或B說TClass,他們如何在不知道內部件的情況下訪問TClass::foo

+1

原樣,'foo'是一個非從屬名稱,你也可以使用'這 - > foo'使其依賴。 – Jarod42

回答

1

請注意foo是一個非從屬名稱,但A是一個從屬基類,它取決於模板參數T...。標準C++說非依賴名稱將不會在依賴基類中查找。

正如你所說,使用A<T...>::foo工作正常,因爲它是一個獨立的名稱。同樣,B::foo也能正常工作。

可以

void yo() { 
    std::cout << A<T...>::foo << '\n'; 
    std::cout << B::foo << '\n'; 
    std::cout << this->foo << '\n'; 
} 

using A<T...>::foo; 
void yo() { 
    std::cout << foo << '\n'; 
} 
+0

'std :: cout << B :: foo <<'\ n';'謝謝。所以,即使B :: foo隱藏了A :: foo,外部訪問foo也沒問題,我會一直得到正確的foo。 – themagicalyang