使用嵌套 class 继承模板 class

Inherit template class with nested class

我想创建一个继承自模板 class A 的 class B。并且我希望 B 的嵌套 class E 成为此继承中的模板参数。更直观:

template <class T>
class A {
}

class B : public A<B::E> {
    class E {
        int x;
    }
}

class C : public A<C::E> {
    class E {
        int x;
        int y;
    }
}

我认为问题在于编译器在处理 B 的声明时不知道 class B 将具有嵌套的 class E,因为我得到错误:

no member named 'E' in 'B'

我看过这个similar question,但我想确认在放弃这种方法之前没有直接解决这个冲突的方法。

谢谢!

我能想到的最接近的方法是使用基数 class。

template <class T>
class A {
};

class B; // forward declaration of ::B
namespace detail { 
class B { 
    friend class ::B;
    class E {
        int x;
    };
};
} /* namespace detail */

class B : public A<detail::B::E> {
};

我认为不能直接完成。

一个明显的方法是在其他命名空间中定义 B::EC::E(至少让它们远离全局命名空间),然后在 [=21 中使用它们=] 类:

template <class T>
class A { /* ... */ };

namespace B_detail {
    class E { /* … */ };
}

class B : public A<B_detail::E> { /* ... */ };

namespace C_detail {
    class E { /* ... */ };
}

class C : public A<C_detail::E> { /* ... */ };

根据具体情况,您也很有可能 need/want 声明 *_detail::E friend of B/C。

正如其他人所说,您不能对嵌套 class 进行前向声明。

因此您可以将 嵌套 class 放在 namespace 中。或者,您可以只删除任何嵌套,但您必须提供不同的名称。

这是一个演示这两种方式的例子。如果您不需要前向声明,代码可能会更简单一些。

#include <memory>

template <class T>
class A {
public:
    A();

    // Demonstrate a possible way that T could be used.
    std::unique_ptr<T> t;
};

template <class T>
A<T>::A() : t(std::make_unique<T>())
{
}

// Using a forward declared (top level) class...
class B : public A<class BE> {
};

class BE {
public:
    int x;
};

// Using a forward declared class inside a namespace...
namespace C_details
{
    class E;
}

class C : public A<C_details::E> {
};

namespace C_details
{
    class E {
    public:
        int x;
        int y;
    };
}


int main()
{
    B b;
    b.t->x = 3;

    C c;
    c.t->y = 4;

    return 0;
}