如何在继承级别为 container-class 做 visible nested-class?

How to do visible nested-class for container-class in inheritance level?

我有一些模板class

template <typename T> class Base { };

我试图从 Base 继承 Derived class 并使用 Internal class 嵌套于 Derived 作为 Base.

的通用参数
class Derived : Base<Internal> {
public: class Internal { };
}

但编译器在 Base 中看不到 Internal

是否可以通过将 Internal class 嵌套在 Derived 中来解决我的问题? 如果可能的话——怎么做?

可以!不可以

()

我认为这行不通。为了定义 class Derived 你首先需要知道基础class(“它必须是一个完整的类型”);要将 模板 Base 实例化为 class,您需要有一个类型。然而,Inner 只是 Derived 的“内部”类型;这是它的定义的一部分。


Definition of Derived  ---needs---> Base<Derived::Inner>
          ^                               |
          |----------needs----------------|

即使是间接访问也无济于事:

template<typename T>
class Base {};

template<template<class> class X, typename T>
struct UseInner : public X<typename T::Inner> {};

class Derived : UseInner<Base, Derived>
{
    public: class Inner {};
};

与此相反,CRTP 工作是因为模板参数可以是 不完整 类型(“无需访问内部”)。

在模板中包装不起作用:

template<typename T>
class Base {};

template<template<class>class X>
struct Wrap
{
    struct Derived : X<typename Derived::Inner> {
        struct Inner {};
    };
};

using RealDerived = typename Wrap<Base>::Derived;