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 {};
};
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 {};
};
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
.
我看不出你怎么能正确地做到这一点。有这个:
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 的回答最能解决这个问题。