来自模板基类的枚举的typedef

时间:2010-10-21 11:27:15

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

对昨晚的回答进行跟进 - 我希望有更多的评论可以为我解答,但没有骰子。

有没有办法在没有继承的情况下实现这一点,而不需要在下面的倒数第二行代码中使用繁琐的代码,这会将值写入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;
}

2 个答案:

答案 0 :(得分:3)

这有帮助吗?

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; 
} 

答案 1 :(得分:2)

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

您展示的代码似乎使用Microsoft语言扩展程序。

在C ++ 98中,enum typename不能用于限定其中一个值名称:

Comeau C/C++ 4.3.10.1 (Oct  6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing.  All rights reserved.
MODE:strict errors C++ C++0x_extensions

"ComeauTest.c", line 17: error: name followed by "::" must be a class or namespace
          name... Wild guess: Did you #include the right header?
      std::cout << B<A>::E::X << std::endl;
                         ^

1 error detected in the compilation of "ComeauTest.c".

所以不是......

typedef typename T::E E;

......做......

typedef T E;

干杯&amp;第h。,