如果父 class 是模板,为什么禁止 decltype'ing 成员?

Why is decltype'ing members of the parent class forbidden if it's a template?

如果基数在派生中被模板化,为什么基数 class 的成员在派生 class 中不可用?

在编译时所有类型都应该被实例化,所以我看不出有什么不同或为什么不同。我可以看到能够创建无法解析的类型的论据;但是,这感觉像是编译时错误,而不是对语言的限制。

更明确地说,为什么这样做有效?

template<typename T>
class A{
protected:
   int member;
};

class B: public A<int>{
   decltype(member) another_member;
};

但是,这不是吗?

template<typename T>
class A{
protected:
   int member;
};

template<typename T>
class B: public A<T>{
   decltype(member) another_member;
};

这个问题有一个 ISOCPP 常见问题解答。

https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-members

并阅读下一篇,了解它如何无声地伤害你

https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-silent-bug

基本上编译器不会查看模板化的基 classes。原因很可能是具体的 class 当时不存在。

前面的示例有效,因为 A<int> 是具体的 class 而 A<T> 不是。出于同样的原因,您被迫将 typename 添加到参数和成员中。

你应该像在

中那样把示波器放回去
decltype(B::member)

警告:不要使用这个。

decltype(A<T>::member)

这将暂时消除警告,直到 B 被实例化;但是,除非 B<T>A<T> 的朋友,否则将无法工作,因为 B 无法通过该名称访问 A<T> 的受保护成员。