gpt4 book ai didi

c++ - 如果两个类都是模板,为什么我不能简单地使用基类中定义的类型?

转载 作者:太空狗 更新时间:2023-10-29 21:41:26 25 4
gpt4 key购买 nike

如果两个类都是模板,为什么我不能简单地使用基类中定义的类型?是否有关于搜索模板成员的规则?这是我可以推断出的最简单的例子:

struct iA {
using type = int;
};
template <class T> struct tA {
using type = T;
};

struct iB1 : iA {
void f(type i) {}
};
struct iB2 : tA<int> {
void f(type i) {}
};
template <class T> struct tB1 : iA {
void f(type i) {}
};
template <class T> struct tB2 : tA<int> {
void f(type i) {}
};
template <class T> struct tB3 : tA<T> {
// void f(type i) {} // error: 'type' has not been declared
void f(typename tA<T>::type i) {}
};

int main() {}

当然,我可以直接加上typename tA<T>:: , 但有更优雅的解决方案吗?

最佳答案

问题是基类是依赖的,因此它的范围只有在我们查找依赖名称时才会被检查。 [临时部门]/3:

In the definition of a class or class template, if a base class depends on a template-parameter, the base class scope is not examined during unqualified name lookup either at the point of definition of the class template or member or during an instantiation of the class template or member.

这条规则的原因是可能有例如基类模板的特化。由于我们在定义时不知 Prop 体的模板参数,因此我们无法检查基类范围。

type不依赖,因此不会在依赖库中查找 tA<T> .但是,因为它不依赖,所以它的声明必须在定义时可用,[temp.res]/10:

If a name does not depend on a template-parameter (as defined in 14.6.2), a declaration (or set of declarations) for that name shall be in scope at the point where the name appears in the template definition; the name is bound to the declaration (or declarations) found at that point and this binding is not affected by declarations that are visible at the point of instantiation.


如果需要使用type经常出现在派生类中,using声明可以提供帮助。

template <class T> struct tB3 : tA<T> {
using typename tA<T>::type;
void f(type i) {}
};

Demo .

关于c++ - 如果两个类都是模板,为什么我不能简单地使用基类中定义的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28792179/

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