繁体   English   中英

模板继承的嵌套类正向声明

[英]Nested class forward declaration for template inheritance

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

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

没有办法专门这样做。 如果确实必须继承自TemplateClass<NestedClass> ,则必须将NestedClass声明移出SomeClass

我看不到您如何正确执行此操作。 有这个:

template<class T> class TemplateClass {};

class NestedClass {};

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

但这只是伪装...

您必须至少向前声明NestedClass:

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

这可行。 在Windows上的MinGW c ++上进行了测试。

更新:@jon我在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的答案最能解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM