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

vso*_*tco 6 c++ templates language-lawyer c++11

我正在尝试使用一个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() {}
Run Code Online (Sandbox Code Playgroud)

无论是g ++还是clang ++都没有编译这段代码,两者都在抱怨

错误:'template'之前的预期unqualified-id

据我所知,Inner是一个依赖的模板名称,所以应该::template在限定其名称时使用,也应该在typename之前使用,因为Base<T>::Inner是依赖类型.我已经尝试了所有可能的组合,有/没有typename/template,没有编译.有没有使用任何方式Innerpublic部分Derived

Bar*_*rry 10

不可能.甲using声明,从[namespace.udecl]:

using typenameopt nested-name-specifier unqualified-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;
};
Run Code Online (Sandbox Code Playgroud)