Может ли внутренний класс шаблонного класса быть не шаблонным классом? - PullRequest
11 голосов
/ 20 июля 2011

Я делаю шаблонный класс с внутренним служебным классом.Все специализации шаблона хотят один и тот же внутренний класс:

template<...> class Outer {
    class Inner { };
};

Это дает мне Outer<...>::Inner, но я хочу, чтобы все Inner были одного типа, как если бы я только что написал:

class Inner { };
template <...> class Outer { };

или если Outer просто не были шаблоном класса:

class Outer {
    class Inner { };
};

, давая мне Outer::Inner.Я хотел бы, чтобы Outer::Inner работал для всех Outer<>, если это возможно (только из соображений пространства имен / ясности).В противном случае, конечно, я могу просто переместить Inner.

Ответы [ 3 ]

15 голосов
/ 20 июля 2011

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

namespace detail {

class Inner {};

} // detail

template<...>
class Outer {
    typedef detail::Inner Inner;
};
13 голосов
/ 20 июля 2011

То, как я делал это в прошлом, использует наследование:

class DummyBase{
protected:
    class Inner{
        //etc...
    };
};

template<...> class Outer : public DummyBase{
    //etc...
};
0 голосов
/ 20 июля 2011

Это будет уникальным для каждого экземпляра Внешнего. Т.е.

Outer<int>::Inner will be a different type from Outer<double>::Inner
...