我遇到以下代码的问题:
class SymmetryTypes
{
public:
enum Type { REAL, COMPLEX, INTEGER, PATTERN, UNINITIALIZED };
void f() { cout << "SymmetryTypes::f() invoked" << endl; };
};
template <class T>
class EnumBase : public T
{
public:
EnumBase() /* : t_(T::UNINITIALIZED) */ { T::f(); }
private:
// T::Type t_;
};
int main(int argc, char* argv[])
{
EnumBase<SymmetryTypes> symmetry;
return 0;
}
它编译,但当我取消注释它没有。看来我可以访问基类T的函数成员,但是不能访问枚举成员及其值(也尝试过typedef)。你知道为什么吗?
答案 0 :(得分:6)
T::Type
旨在引用某种类型,因此您需要typename
typename T::Type t_;
如果省略typename
,它会在解析模板时认为您正在声明名为T::Type
的成员(然后它会在t_
出错,因为不会有第二个之后的名字)。请记住,当时还不知道T
是什么。更详细的解释can be found here。
会员初始化程序很好。编译器可能会因成员声明无效而感到困惑。