2

What's the proper way to inherit from a template class with the template argument being a nested class within the inheriting class?

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

3 回答 3

4

There's no way to do specifically that. If you really have to inherit from TemplateClass<NestedClass>, you'll have to move the NestedClass declaration out of SomeClass.

于 2009-11-11T00:31:24.493 回答
0

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

template<class T> class TemplateClass {};

class NestedClass {};

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

但这只是假装...

于 2009-11-11T09:25:01.860 回答
-1

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

于 2009-11-11T05:30:13.860 回答