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

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

最佳答案

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

typename T::Type t_;

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

成员初始值设定项很好。编译器可能会对无效的成员声明感到困惑。

关于c++ - 从 C++ 中的模板参数继承时无法访问基类的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5133732/

相关文章:

c++ - 编译extern "C"{...}时如何链接依赖?

c++ - 为什么原始 curl 构造函数 {} 不返回右值?

C++ 使用类标记数学表达式

c++ - multi_index 哈希唯一可选参数

c++ - 在运行时获取类型参数

c++ - 委托(delegate)给另一个对象的运算符(operator)->

java - 继承 Java 集合接口(interface)(Set、Map、List 等)的 C++ 等价物是什么?或者扩展 AbstractCollection?

python - 有没有办法在 Python3 的 super() 中忽略部分 __init__() 方法?

python - 通过 C++ 的 RPC 启动新线程会导致进程僵尸化?

c++ - 模板和字符串文字和 UNICODE