通过using指令将私有继承的内部模板公开

Making a private inherited inner template public via a using directive

本文关键字:内部 继承 指令 using 通过      更新时间:2023-10-16

我正试图使用using指令来引入派生类的public访问声明——在库中声明的某个内部类模板。代码:

template <typename T>
class Base
{
public:    
    template<typename U>
    struct Inner;
};
template<typename T>
class Derived: private Base<T>
{
public:
    using typename Base<T>::template Inner; // make it visible
    Inner<T>* ptr; // no need for typename here, non-qualified name
};
int main() {}

g++和clang++都没有编译这个代码,都抱怨

错误:在"template"之前需要不合格的id

据我所知,Inner是一个依赖模板名称,因此在限定其名称时应该使用::template,之前也应该使用typename,因为Base<T>::Inner是依赖类型。我已经尝试了所有可能的有/没有typename/template的组合,但都没有编译。有没有办法在Derivedpublic部分使用Inner

不可能。使用声明是,来自[namespace.udcl]:

using typenameopt嵌套名称说明符不合格id

但是不合格的id不能是类模板。

你可以改成一个别名:

template<typename T>
class Derived: private Base<T>
{
public:
    template <typename U>
    using Inner = typename Base<T>::template Inner<U>;
    Inner<T>* ptr;
};