Как сделать видимый вложенный класс для контейнерного класса на уровне наследования? - PullRequest
2 голосов
/ 03 августа 2020

У меня есть некоторый шаблонный класс

template <typename T> class Base { };

Я пытаюсь наследовать производный класс от Base и использовать Internal класс, который является вложенным of Получено как общий c аргумент Base .

class Derived : Base<Internal> {
public: class Internal { };
}

Но компилятор не видит Internal in База .

Можно ли решить мою проблему с сохранением Internal класса как вложенного в Derived ? А если возможно - как?

1 Ответ

4 голосов
/ 03 августа 2020

Можно! Нет

( аналогичный вопрос )

Не думаю, что это сработает. Для того, чтобы определить класс Derived, вам нужно сначала знать базовый класс («это должен быть полный тип»); чтобы создать экземпляр шаблона Base в классе, вам необходимо иметь тип. Однако 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;
...