从C++中的模板参数继承时,无法访问基类的枚举

Dan*_*ica 2 c++ parameters inheritance templates

我有以下代码的问题:

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;
}
Run Code Online (Sandbox Code Playgroud)

它编译,但当我取消注释它没有.看来我可以访问基类T的函数成员,但是不能访问枚举成员及其值(也尝试过typedef).你知道为什么吗?

Joh*_*itb 7

T::Type 是指一种类型,所以你需要 typename

typename T::Type t_;
Run Code Online (Sandbox Code Playgroud)

如果省略typename,它会在解析模板时认为您正在声明一个名称为的成员T::Type(然后t_由于之后没有第二个名称而出错).记住它在那时还不知道还有什么T.这里可以找到更详细的解释.

成员初始化程序很好.编译器可能会因成员声明无效而感到困惑.