template base class typedef members invisible
我知道编译器默认情况下"依赖名称"是不可见的。但是我被告知其他问题(这里,这里,最后是C++ FAQ),EDCOX1×0声明可能有帮助。
所以我试过了。
模板基类:
1 2 3 4 5 6 7 | // regardless of the fact that members are exposed... template<typename T> struct TBase { typedef T MemberType; MemberType baseMember; MemberType baseFunction() { return MemberType(); } }; |
和派生类,使用基的成员:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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的"依赖名称"定律?
你可能想这样做:
1 | using MemberType = typename TBase<T>::MemberType; // new type alias syntax |
或
1 | typedef typename TBase<T>::MemberType MemberType; // old type alias syntax |
语法
还要注意,实际上不需要这些,您可以限定每种使用(对于具有基的类型,对于具有