我有一个实现类 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,后者又继承自 Cbase。所以我不明白为什么我不需要类型名来访问 CPublishedTypes::published_t 。
我在名称查找规则中遗漏了什么?
最佳答案
依赖于模板参数的类型需要以 typename
为前缀,如果是模板基类,则为父类的名称。然而,在最后一个示例中,该类不是模板,因此这不是必需的,因为 Cderived
的类型查找不会延迟到模板实例化,因此适用常规查找规则。
关于c++ - 模板和嵌套类型查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19178443/