gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:15:32 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com