【问题标题】:typedef for enum from template base class来自模板基类的枚举类型定义
【发布时间】:2010-10-21 11:27:15
【问题描述】:

跟进昨晚的回答 - 我希望更多的 cmets 会为我回答这个问题,但没有骰子。

有没有一种方法可以在没有继承的情况下实现这一点,并且不需要下面倒数第二行代码中的繁琐用法,它将值写入cout

struct A {
    enum E {
        X, Y, Z
    };
};

template <class T>
struct B {
    typedef typename T::E E;
};

// basically "import" the A::E enum into B.
int main(void)
{
    std::cout << B<A>::E::X << std::endl;
    return 0;
}

【问题讨论】:

    标签: c++ visual-c++ templates inheritance enums


    【解决方案1】:

    这有帮助吗?

    struct A { 
        enum E { 
            X, Y, Z 
        }; 
    }; 
    
    template <class T> 
    struct B : private T{    // private inheritance.
    public: 
        using T::X; 
    }; 
    
    // basically "import" the A::E enum into B. 
    int main(void) 
    { 
        B<A>::X;             // Simpler now?
        return 0; 
    } 
    

    【讨论】:

    • 有什么方法可以在没有继承的情况下做到这一点?
    • 为什么,private 继承会导致什么问题?
    【解决方案2】:

    将名称enum 值名称直接放入类的唯一方法是从具有这些名称的类继承。

    您显示的代码似乎使用了 Microsoft 语言扩展。

    在 C++98 中,enum 类型名不能用于限定值名称之一:

    用于 ONLINE_EVALUATION_BETA2 的 Comeau C/C++ 4.3.10.1(2008 年 10 月 6 日 11:28:09) 版权所有 1988-2008 Comeau Computing。版权所有。 模式:严格错误 C++ C++0x_extensions “ComeauTest.c”,第 17 行:错误:名称后跟“::”必须是类或命名空间 名称... 疯狂猜测:您是否#include 了正确的标题? std::cout ::E::X

    所以不是...

    typedef typename T::E E;
    

    ...做...

    typedef T E;
    

    干杯,

    【讨论】:

    • 当我进行建议的更改时,cout 行无法编译。错误 C2039:“X”:不是具有 [T=A] 的“B”的成员
    • @Steve:不,它应该与原始用法一起使用(只是改变 typedef)。如果您希望值X 直接可用而无需限定,则必须继承它们。就像史蒂夫的回答一样。但我认为最终你不想这样做。 “最后” → 可能几年后... ;-) 干杯&hth。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2016-07-17
    相关资源
    最近更新 更多