如何在继承级别为 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;
我有一些模板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;