模板基类typedef成员不可见
template base class typedef members invisible
我知道"依赖名称"在默认情况下对编译器不可见。但在回答其他SO问题时(在这里,在这里,最终在C++问题中),我被告知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
这是预期的行为吗?我们应该如何绕过访问父模板类成员typedefs的"依赖名称"定律?
您可能想要做:
using MemberType = typename TBase<T>::MemberType; // new type alias syntax
或
typedef typename TBase<T>::MemberType MemberType; // old type alias syntax
语法using Base::member;
只能用于将非类型成员的声明带入作用域。
另外请注意,这些都不是实际需要的,您可以限定每次使用(对于带基数的类型,对于带this->
或基数的非类型),这将使符号依赖。
相关文章:
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 如何对绑定的成员方法进行typedef,然后将该类型用作模板参数
- 返回没有 typedef 的成员函数指针的语法是什么?
- Typedef 不是命名空间的成员
- C++ 使用另一个类的 typedef'ed 成员时出现编译错误
- 模板基类typedef成员不可见
- 如何从对象实例中获取成员Typedef
- 具有一个成员或仅typedef的结构
- 如何为联合成员定义typedef
- UnspecifiedPoolType的类型?关于typedef、成员函数指针和转换运算符
- 带有类 - 非静态成员调用的 typedef 函数声明
- Typedef 用于指向 cv 和/或 ref 限定成员函数的指针
- 重载以 typedef 别名作为参数的成员方法
- 缩短C++枚举成员的路径(使用 typedef 或 typename),以用作模板参数
- 如何在 typedef 中使用模板化类的数据成员
- 如何访问可变模板参数包成员中的内部模板typedef
- C++为成员函数提供typedef模板的一种方法
- 我能用类非静态成员方法的typedef做什么
- 使用类外模板类的typedef成员作为成员函数的返回类型
- typedef 以下类型:指向具有成员函数 F 的成员函数 Fof "any"类的指针