我正在尝试使用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++都不编译此代码,都提示



据我所知,Inner是一个从属模板名称,因此,在限定其名称时应使用::template,并且在使用typename之前也应使用Base<T>::Inner,因为typename/template是从属类型。我尝试了所有可能的组合,包括/不带Inner,并且都没有编译。有什么方法可以在publicDerived部分使用ojit_code吗?

最佳答案

不可能。使用声明来自[namespace.udecl]:



但是,不合格ID不能是类模板。

您可以改用别名:

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

    Inner<T>* ptr;
};

关于c++ - 通过using指令公开私有(private)继承的内部模板,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30492993/

10-13 07:04