【问题标题】:Access base member in a class, which derives from a nested class in a template class访问类中的基成员,该类派生自模板类中的嵌套类
【发布时间】:2022-01-19 01:45:53
【问题描述】:

我想要一个具有嵌套类的模板。然后我想要一个模板,它继承了第一个模板,也有一个嵌套类。然后我希望这个嵌套类继承他的所有者基嵌套类。我可以做到,但我不能从另一个访问第一个嵌套类的成员。我做错了什么,或者根本不可能?为什么?我该怎么做才能解决问题(如果可能)/替代决定(如果不可能)?

template <class T, class T2>
class Class1
{
public:
    class NestedClass1;
};

template <class T, class T2>
class Class1<T, T2>::NestedClass1
{
public:
    void Do()
    {

    }
};

template <class T>
class Class2 : Class1<T, int>
{
public:
    class NestedClass2;
};

template <class T>
class Class2<T>::NestedClass2 final : Class2<T>::NestedClass1
{
public:
    void Do2()
    {
        this->Do(); // Why there is no "Do" in this?
    }
};

【问题讨论】:

  • 我尝试编译您的示例并收到以下错误:circular inheritance between 'Class2&lt;T&gt;::NestedClass2' and 'Class2::NestedClass2' 您的问题可以通过将NestedClass2 定义为:class Class2&lt;T&gt;::NestedClass2 final : Class1&lt;T, int&gt;::NestedClass1 我不知道您的示例到底出了什么问题但我认为这与在: 的两侧使用Class2 有关,即在基础部分和子部分。
  • @mix 哪个编译器会产生这个错误?
  • 看起来 Clang 要求您编写如下内容:class Class2&lt;T&gt;::NestedClass2 final : Class2&lt;T&gt;::template Class1&lt;T,int&gt;::NestedClass1Demo

标签: c++ templates inheritance inner-classes


【解决方案1】:

你的代码似乎在流行的编译器上编译得不太好:

template <class T>
class Class2<T>::NestedClass2 final : Class2<T>::NestedClass1

关于它,clang 抱怨 Class2 中没有任何 NestedClass1。 它在技术上具有,因为继承的嵌套类也是嵌套类,但是 clang 在所述上下文中不同意,使用 clang 的代码库构建的工具也是如此。

这是适用于所有三个主要编译器的解决方法:

template <class T>
class Class2<T>::NestedClass2 final : Class1<T, int>::NestedClass1

【讨论】:

  • Class2 里面绝对有 NestedClass1,继承自 Class1。
  • gcc 说它有 clang 说它没有。两人似乎都对我的建议感到满意。
  • 我也可以使用class Class2&lt;T&gt;::NestedClass2 final : Class1&lt;T, int&gt;::NestedClass1。和我的class Class2&lt;T&gt;::NestedClass2 final : Class2&lt;T&gt;::NestedClass1 IDE 一样。
  • 当 Visual Studio 使用 msvc 作为编译器,但在代码分析中使用 clang 的部分时,可能会发生这种争议。尝试编写所有 3 个编译器都以相同方式处理的代码。聪明的工具无法阅读的代码肯定也会让人类读者感到困惑。
猜你喜欢
  • 2012-09-12
  • 1970-01-01
  • 2018-09-18
相关资源
最近更新 更多