我知道“依赖名称”默认情况下对编译器不可见。但是在回答其他SO问题(这里,这里和最终在C++ FAQ上)时,有人告诉我可以使用
一个模板基类:
我在ideone上尝试了这个。它有gcc-4.3.3和gcc-4.5.1。
这是期望的行为吗?我们应该如何解决访问父模板类成员typedef的“依赖名称”法律问题?
using
声明来解决。所以我尝试了一下。一个模板基类:
// regardless of the fact that members are exposed...
template<typename T>
struct TBase {
typedef T MemberType;
MemberType baseMember;
MemberType baseFunction() { return MemberType(); }
};
一个派生类,使用基类成员:
template<typename T>
struct TDerived : public TBase<T> {
// http://www.parashift.com/c++-faq-lite/nondependent-name-lookup-members.html
// tells us to use a `using` declaration.
using typename TBase<T>::MemberType;
using TBase<T>::baseFunction;
using TBase<T>::baseMember;
void useBaseFunction() {
// this goes allright.
baseFunction();
++baseMember;
// but here, the compiler doesn't want to help...
MemberType t; //error: expected `;' before ‘t’
}
};
我在ideone上尝试了这个。它有gcc-4.3.3和gcc-4.5.1。
这是期望的行为吗?我们应该如何解决访问父模板类成员typedef的“依赖名称”法律问题?
TBase<T>::baseMember
,2) 使用前缀this->baseMember
,3) 添加语句using TBase<T>::baseMember
,4) 使用启用宽松模式的全局编译器开关。这些解决方案的优缺点和详细信息在 https://dev59.com/Eek5XIcBkEYKwwoY7eQE 中有描述。 - George Robinson