c++ - 模板和嵌套类型查找

标签 c++ templates inheritance

我有一个实现类 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/

相关文章:

odoo - 从预定义模块继承表单 View

c++ - 编译时绑定(bind) C++ 模板?

c# - 将基类属性重写为派生类型并通过基类访问

c++ - 如何根据返回类型编写模板化自由函数

c++ - 静态库

javascript - 在没有 div 的情况下将 Javascript 字符串插入到 html 中的最简单方法?

c++ - 在模板和非模板代码之间进行交互时替换 switch 语句

c++ - 检查一个对象的类是否派生自 C++ 中另一个对象的类

c++ - 什么时候除以零而不是除以零?调试器中的一个谜题(静态变量问题)

c++ - 防止将字符串文字转换为 bool 与 std::string