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

时间:2011-02-27 14:28:14

标签: c++ templates inheritance parameters

我遇到以下代码的问题:

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)。你知道为什么吗?

1 个答案:

答案 0 :(得分:6)

T::Type旨在引用某种类型,因此您需要typename

typename T::Type t_;

如果省略typename,它会在解析模板时认为您正在声明名为T::Type的成员(然后它会在t_出错,因为不会有第二个之后的名字)。请记住,当时还不知道T是什么。更详细的解释can be found here

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