xto*_*ofl 13 c++ templates typedef dependent-name
我知道默认情况下编译器不能看到"依赖名称".但是我在回答其他SO问题(这里,在这里,最终在C++ faq)时被告知using声明可能有所帮助.
所以我试过了.
模板基类:
// regardless of the fact that members are exposed...
template<typename T>
struct TBase {
typedef T MemberType;
MemberType baseMember;
MemberType baseFunction() { return MemberType(); }
};
Run Code Online (Sandbox Code Playgroud)
和派生类,使用基数的成员:
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’
}
};
Run Code Online (Sandbox Code Playgroud)
我在想法上尝试了这个.它有gcc-4.3.3和gcc-4.5.1
这是预期的行为吗?我们如何解决访问父模板类'成员typedef的'依赖名称'法则?
Dav*_*eas 19
你可能想做:
using MemberType = typename TBase<T>::MemberType; // new type alias syntax
Run Code Online (Sandbox Code Playgroud)
要么
typedef typename TBase<T>::MemberType MemberType; // old type alias syntax
Run Code Online (Sandbox Code Playgroud)
语法using Base::member;只能用于将非类型成员的声明带入作用域.
另请注意,这些都不是实际需要的,您可以限定每次使用(对于具有基础的类型,对于具有其中一个this->或基础的非类型)并且将使符号相关.