2017-07-30 26 views
1

我的代碼使用內部類的模板類的地方屬於

#include <iostream> 
using namespace std; 

template<typename E> 
struct Node{}; 

template<typename E,typename I> 
class List{ 
public: 
    class Iterator{ 
    public: 
    private: 
    ListNodePtr ptr; //‘ListNodePtr’ does not name a type 
    }; 
private: 
    ListNodePtr foo(ListNodePtr); // ‘ListNodePtr’ does not name a type 
    struct ListNode:public Node<E>{}; 
    typedef ListNode* ListNodePtr; 
}; 

我得到錯誤信息(以上評論)

我怎樣才能使它發揮作用?

另外,我不知道如何的.cpp

我真的很感謝所有幫助定義ListNodePtr foo (ListNodePtr)

+2

也許移動'typedef ListNode * ListNodePtr;''上面'class Iterator {'會幫忙嗎? – VTT

+0

你正在使用struct List,我認爲它應該是class List – 3stud1ant3

+0

@ user1000'class'和'struct'只有3個區別。成員的默認訪問說明符。從類型繼承時的默認訪問說明符。事實上,你可以使用'class'而不是'typename'作爲模板參數,但是你不能使用'struct'。所以,使用'struct'就完全沒問題。 – OmnipotentEntity

回答

0

第一次使用時必須知道類型。 您必須更改聲明的順序。

請注意,類型ListNodePtr必須知道類List::Iterator宣佈時,因爲該類在類內使用。

template<typename E,typename I> 
struct List{ 
private: 
    struct ListNode:public Node<E>{}; 
    typedef ListNode* ListNodePtr; 
public: 
    class Iterator{ 
     ListNodePtr ptr; 
    }; 
private: 
    ListNodePtr foo(ListNodePtr); 
}; 

對於結構ListNode也可以使用前向聲明。

template<typename E,typename I> 
struct List{ 
private: 
    struct ListNode; // forward declartion of the structure `ListNode` 
    typedef ListNode* ListNodePtr; 
public: 
    class Iterator{ 
     ListNodePtr ptr; 
    }; 
private: 
    ListNodePtr foo(ListNodePtr); 
    struct ListNode:public Node<E>{}; 
}; 
+0

哦,這樣做,謝謝! –

1

類型聲明應該在其用法上較高。

移動你的typedef使用前。

Here一個編譯的demo。

+0

但我希望結構'ListNode'在'List'中是私有的。 –

+1

@FrankWang您可以將其標記爲私有。實際上,使用訪問說明符而不是按組進行分組是一種很好的做法。 – VTT