Может ли внутренний класс класса шаблона быть классом без шаблона?

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

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

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

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

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

class Outer {
    class Inner { };
};

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

Ответ 1

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

namespace detail {

class Inner {};

} // detail

template<...>
class Outer {
    typedef detail::Inner Inner;
};

Ответ 2

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

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

template<...> class Outer : public DummyBase{
    //etc...
};

Ответ 3

Он будет уникальным для каждого экземпляра Outer. I.e.,

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