簡體   English   中英

模板繼承的嵌套類正向聲明

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM