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

时间:2009-11-11 00:28:41

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

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

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

3 个答案:

答案 0 :(得分:4)

没有办法专门做那件事。如果您真的必须继承TemplateClass<NestedClass>,则必须将NestedClass声明移出SomeClass

答案 1 :(得分:0)

我看不出你怎么能这样做。有这个:

template<class T> class TemplateClass {};

class NestedClass {};

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

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

答案 2 :(得分:-1)

您必须至少声明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的答案最能解决这个问题。

相关问题