我有一個模板類層次結構實現類似模式的CRTP。我不明白爲什麼名稱查找在標有錯誤的行中失敗,並且在標有「此處沒有錯誤」的行中成功。模板和嵌套類型查找
class CPublishedTypes
{
public:
typedef int published_t;
};
template<class Derived, class PublishedTypes> class Cbase: public PublishedTypes
{
public:
Cbase():ibase_(42){}
private:
published_t ibase_; //error: 'published_t' does not name a type
};
template<class Derived> class Cmiddle : public Cbase<Derived, CPublishedTypes>
{
public:
Cmiddle():imiddle_(42){}
private:
published_t imiddle_; //error: 'published_t' does not name a type
};
class Cderived : public Cmiddle<Cderived>
{
public:
Cderived():iderived_(42){}
private:
published_t iderived_; // No errors here
};
int main(int argc, char *argv[])
{
Cderived derived;
return 0;
}
使用'typename'沒有幫助。
的C++ FAQ描述了相似但不相同的問題在這裏:http://www.parashift.com/c++-faq/nondependent-name-lookup-types.html
CBase的從PublishedTypes,這是一個模板參數公開繼承,但它不是一個模板類。所以我不明白爲什麼CPublishedTypes :: published_t是無法訪問的。
Cderived從Cmiddle繼承,Cmiddle繼承自Cbase。所以我不明白爲什麼我不需要一個類型名來訪問CPublishedTypes :: published_t這裏。
我在名稱查找規則中缺少什麼?
@templaterex:不完全重複。 Hassan Syed的例子看起來像FAQ條目:他從模板基類繼承。我是從一個簡單的非模板類繼承的,它恰好是一個模板參數。 –