Невозможно получить доступ к базовому классу enum при наследовании от параметра шаблона в C ++ - PullRequest
1 голос
/ 27 февраля 2011

У меня проблема со следующим кодом:

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, но не могу получить доступ к члену enum и его значениям (также пробовал typedefs). Ты знаешь почему?

1 Ответ

7 голосов
/ 27 февраля 2011

T::Type предназначен для ссылки на тип, поэтому вам нужно typename

typename T::Type t_;

Если вы опустите typename, он думает, что при синтаксическом анализе шаблона вы объявляете член, чье имяравен T::Type (а затем выдает ошибку на t_, потому что потом не может быть второго имени).Помните, что в тот момент он еще не знал, что такое T.Более подробное объяснение можно найти здесь .

Инициализатор члена в порядке.Компилятор, вероятно, запутался из-за того, что объявление члена недопустимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...