通过 using 指令制作私有继承的内部模板 public

Making a private inherited inner template public via a using directive

我正在尝试使用 using 指令引入 public 派生 class 某些内部 class 模板的访问声明。代码:

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++ 都不编译这段代码,都抱怨

error: expected unqualified-id before 'template'

据我所知,Inner是一个从属模板名称,因此在限定其名称时应使用::template,并且在前面还要使用typename,因为Base<T>::Inner 是依赖类型。我已经尝试了所有可能的组合 with/without typename/template 和 none 编译。有什么方法可以在 Derivedpublic 部分使用 Inner 吗?

不可能。 using-declaration 来自 [namespace.udecl]:

using typenameopt nested-name-specifier unqualified-id ;

但是 unqualified-id 不能是 class 模板。

您可以只创建一个别名:

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

    Inner<T>* ptr;
};