如果父 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>
的受保护成员。
如果基数在派生中被模板化,为什么基数 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>
的受保护成员。