typedef для перечисления из базового класса шаблона - PullRequest
2 голосов
/ 21 октября 2010

Продолжение ответа от прошлой ночи - я надеялся, что больше комментариев ответит на это для меня, но без кубиков.

Есть ли способ достичь этого без наследования, который не требует громоздкого использования в предпоследнемстрока кода ниже, которая записывает значение в 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 ]

3 голосов
/ 21 октября 2010

Помогает ли это?

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; 
} 
2 голосов
/ 21 октября 2010

Единственный способ поместить имена enum имен значений непосредственно в класс - это наследовать от класса с этими именами.

Код, который вы показываете, похоже, использует расширение языка Microsoft.

В C ++ 98 имя типа enum нельзя использовать для обозначения одного из имен значений:

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;

... do ...

typedef T E;

Приветствия и hth.,

...