【问题标题】:Nested class forward declaration for template inheritance模板继承的嵌套类前向声明
【发布时间】:2009-11-11 00:28:41
【问题描述】:

从模板类继承的正确方法是什么?模板参数是继承类中的嵌套类?

class SomeClass : public TemplateClass<NestedClass>
{
     class NestedClass {};
};

【问题讨论】:

    标签: c++ inheritance templates forward-declaration nested-class


    【解决方案1】:

    没有办法专门做到这一点。如果你真的必须从TemplateClass&lt;NestedClass&gt; 继承,你必须将NestedClass 声明移出SomeClass。

    【讨论】:

    • 是的,也想不出别的办法。你可以做struct Hull { class NestedClass { }; }; class SomeClass : Hull, TemplateClass&lt;Hull::NestedClass&gt; { }; 然后,你有嵌套类SomeClass::NestedClass。
    • @JohannesSchaub-litb 这是处理某些事情的好方法!
    【解决方案2】:

    我看不出你怎么能正确地做到这一点。有这个:

    template<class T> class TemplateClass {};
    
    class NestedClass {};
    
    class SomeClass : public TemplateClass<NestedClass>
    {
        typedef NestedClass NestedClass;
    };
    

    但那只是假装的......

    【讨论】:

      【解决方案3】:

      您必须至少提前声明 NestedClass:

      class NestedClass;
      template<class T> class TemplateClass{};
      class SomeClass : public TemplateClass<NestedClass>
      {
           class NestedClass{};
      };
      

      这行得通。在 Windows 上的 MinGW c++ 上测试。

      更新: @乔恩 我在 Windows XP 上使用 gcc 3.4.5 版尝试了以下操作:

      #include <iostream>
      
      class NestedClass;
      template<class T> class TemplateClass{};
      class SomeClass : public TemplateClass<NestedClass>
      {
      public:
           class NestedClass{ 
           public: 
              int a; 
              static int test(){ return 100; }
           };
           NestedClass nc;
      };
      
      int main(){
       SomeClass sc;
       sc.nc.a = 10;
       std::cout<< sc.nc.a << std::endl;
       std::cout<< sc.nc.test() << std::endl;
      }
      

      而且,我得到以下输出: 10 100

      但是,我猜作者的意图(就像@jon 建议的那样)实际上是这样的:

      class SomeClass::NestedClass;
      template<class T> class TemplateClass{};
      class SomeClass : public TemplateClass<SomeClass::NestedClass>
      {
      public:
           class NestedClass{};
           NestedClass nc;
      };
      

      这不起作用。原因是为了能够在模板规范中声明 SomeClass::NestedClass,应该声明 SomeClass。但是,我们正试图做到这一点——因此我们得到了一个循环依赖。

      所以我猜@jon 的回答最能解决这个问题。

      【讨论】:

      • 不幸的是,这是两个不同的嵌套类。您可以通过向嵌套类添加静态 test() 方法来检查这一点,然后尝试从 TemplateClass 调用它。在 VS2008 上,您会收到“使用未定义类型 'NestedClass'”错误。
      • 你的例子没有在 TemplateClass 中调用 NestedClass 的测试方法。您仍然有两个不同的 NestedClass - 一个在 SomeClass 中定义,另一个在 TemplateClass 基类中定义,该基类已声明但从未定义。无论如何,我认为每个人都同意,这真的做不到。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      相关资源
      最近更新 更多