[英]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.