unD*_*rbs 1 c++ templates language-design
如果基类在派生类中模板化,为什么基类的成员在派生类中不可用?
在编译时,所有类型都应该被实例化,所以我不明白它有什么不同或为什么不同。我可以看到一个关于能够创建无法解析的类型的论点;但是,这感觉像是编译时错误,而不是对语言的限制。
更明确地说,为什么这有效?
template<typename T>
class A{
protected:
int member;
};
class B: public A<int>{
decltype(member) another_member;
};
Run Code Online (Sandbox Code Playgroud)
但是,这不是吗?
template<typename T>
class A{
protected:
int member;
};
template<typename T>
class B: public A<T>{
decltype(member) another_member;
};
Run Code Online (Sandbox Code Playgroud)
小智 6
有一个关于此问题的 ISOCPP 常见问题解答。
https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-members
并阅读下一篇,了解它如何无声地伤害你
https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-silent-bug
基本上编译器不会查看模板化基类。原因可能是此时具体类不存在。
前面的示例之所以有效,是因为A<int>是一个具体类,而A<T>不是。出于同样的原因,您被迫添加typename参数和成员。
您应该将范围放回原样
decltype(B::member)
Run Code Online (Sandbox Code Playgroud)
警告:不要使用这个。
decltype(A<T>::member)
Run Code Online (Sandbox Code Playgroud)
这将暂时使警告静音,直到 aB被实例化;B<T>但是,除非是 的朋友,否则不起作用A<T>,因为B无法A<T>通过该名称访问 的受保护成员。
| 归档时间: |
|
| 查看次数: |
247 次 |
| 最近记录: |