模板类的内部类可以是非模板类吗?

Can an inner class of a template class be a non-template class?

本文关键字:是非 内部类      更新时间:2023-10-16

我正在制作一个内部实用程序类的模板类。模板的所有特化都需要相同的内部类:

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

得到Outer<...>::Inner,但我希望所有Inner都是相同的类型,就像我刚刚写的那样:

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

或者如果Outer不是模板类:

class Outer {
    class Inner { };
};

给我Outer::Inner。如果可能的话,我想让Outer::Inner为所有Outer<>工作(只是出于名称空间/清晰度的原因)。否则我可以把Inner移出

嵌套类可以是非模板,但模板的每个实例化都有自己的嵌套类,因为它们(否则)是不相关的类型。你可以做

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

我过去使用的方法是使用继承:

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

对于Outer的每个实例化都是唯一的。例如,

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