【发布时间】:2009-11-11 00:28:41
【问题描述】:
从模板类继承的正确方法是什么?模板参数是继承类中的嵌套类?
class SomeClass : public TemplateClass<NestedClass>
{
class NestedClass {};
};
【问题讨论】:
标签: c++ inheritance templates forward-declaration nested-class
从模板类继承的正确方法是什么?模板参数是继承类中的嵌套类?
class SomeClass : public TemplateClass<NestedClass>
{
class NestedClass {};
};
【问题讨论】:
标签: c++ inheritance templates forward-declaration nested-class
没有办法专门做到这一点。如果你真的必须从TemplateClass<NestedClass> 继承,你必须将NestedClass 声明移出SomeClass。
【讨论】:
struct Hull { class NestedClass { }; }; class SomeClass : Hull, TemplateClass<Hull::NestedClass> { }; 然后,你有嵌套类SomeClass::NestedClass。
我看不出你怎么能正确地做到这一点。有这个:
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++ 上测试。
更新: @乔恩 我在 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 的回答最能解决这个问题。
【讨论】: