Псевдоним (или определение типа) внутреннего класса параметризованного класса - PullRequest
0 голосов
/ 04 ноября 2019

Скажите, у меня есть это (застрял с C ++ 03).

template <class T, int S>
class FiniteMap
{
public:
    class Iterator {};
    class Entry {};
};

class Foo {};

template <class T, int S>
class FooMap : public FiniteMap<T,S>
{
public:
    void bar()
    {
        FooMap<T,S>::Iterator iter;
        FooMap<T,S>::Entry    entry;
    }
};

int main()
{
    return 0;
}

Я хочу typedef FooMap<T,S>::Iterator и FooMap<T,S>::Entry, но если я попробую это:

typedef FooMap<T,S>::Iterator FooIterator;

Я получаю сообщение об ошибке: «T» не было объявлено в этой области ». Если я попытаюсь поместить в него параметры шаблона:

typedef
    template <class T, int S>
    FooMap<T,S>::Iterator FooIterator;

, я получаю «ошибку: ожидаемый неквалифицированный идентификатор перед шаблоном».
Я прибегаю к использованию #define:

#define FooIterator typename FooMap<T,S>::Iterator

Похоже, это работает (хотя он не работает на Онлайн-компилятор C ++ ).

Хотя это выглядит как хакерство.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

C ++ 11 имеет `using для этого:)

Когда я попробовал на C ++ 03, я получил ошибку" need typename перед FiniteMap, поскольку это зависимая область видимости .. .

Таким образом:

template <class T, int S>
class FiniteMap {
public:
    class Iterator {};
    class Entry {};
};

class Foo {};

template <class T, int S>
class FooMap : public FiniteMap<T, S> {
public:
    typedef typename FiniteMap<T, S>::Iterator FooIterator;
    typedef typename FiniteMap<T, S>::Entry FooEntry;

    void bar()
    {
        FooIterator iter;
        FooEntry    entry;
    }
};

int main()
{
    FooMap<int, 3> test;

    return 0;
}

На GodBolt

1 голос
/ 04 ноября 2019

С

typedef FooMap<T,S>::Iterator FooIterator;

компилятор жалуется на то, что T (и, вероятно, S) не объявлено - и я должен согласиться.
Если вы хотите сохранить T абстрактным, то вы застряли с использованиемпараметризованный шаблон.

Но я думаю, что вы на самом деле хотите ввести определение "short" для конкретного случая T = Foo и S = ​​5.
Это можно сделать таким образом

/* ... start of your file */
class Foo {};
typedef FooMap<Foo,5>::Iterator FooIterator;
int main()
{
}
...