看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, Gcc, Linux, ...) DEV C++ 問題(Question): 我在書上看到用template去做Stack,資料處理的方式是Dynamic Array。 而我想說試試看用template去處理linked-list做成的Stack。 不過目前碰到一個我實在想不通的問題。 程式碼(Code): (請善用置底文標色功能) template <typename StackElement> class Stack { ..... private: class Node { public: StackElement data; Node *next; Node(StackElement value, Node *link=0):data(value), next(link){} }; typedef Node* NodePointer; NodePointer mytop; }; template <typename StackElement> Stack<StackElement>::Stack(const Stack<StackElement> &original) { .... mytop = new Stack<StackElement>::Node(original.top()); // 這行出錯 .... } 跑出的訊息是 'class Stack<StackElement>::Node' is not a type 還有後面有很多地方也跑出類似的訊息,像是 template <typename StackElement> Stack<StackElement>::~Stack() { Stack<StackElement>::NodePointer currPtr = mytop, nextPtr; while(currPtr != 0) { nextPtr = currPtr->next; // 這行出錯 .... } } 它顯示 'nextPtr' undeclared (first use this function) 補充說明(Supplement): 我是在想,是不是因為class Stack裡面的class Node不能用 Stack<StackElement>::Node 這樣的語法呢? 因為書上沒有這樣的範例,我就自己試過幾種排列組合, 不過錯誤訊息仍然存在。 請問是哪邊出錯了呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.118.44.32
loveme00835:加上 typename 關鍵字, 你不加他會當成static member 12/16 16:37
loveme00835:而不是一個型態 12/16 16:43
yueayase:好像typedef放在template裡常常會發生這種事,不知道 12/16 20:07
yueayase:typedef的意義是什麼?和typename相比有什麼不同? 12/16 20:07
loveme00835:在檢查模板語法的時候, 編譯器並不知道你::左邊型態的 12/16 20:25
loveme00835:詳細資訊, 所以也就當然不知道::右邊到底是什麼東西 12/16 20:26
loveme00835:他只能"猜"這是一個靜態成員, 你不明確跟他講「這是一 12/16 20:27
loveme00835:種型態」他當然會報錯 12/16 20:28
loveme00835:typedef 是為型態取另一個名字, typename 是跟編譯器 12/16 20:28
loveme00835:講後面接著的東西是一種型態, 這兩個關鍵字的差別教科 12/16 20:29
loveme00835:書上都有寫= __ = 12/16 20:29