2011-04-08 69 views
1

好吧,現在已經在C++上工作了大約2天。剛剛完成JavaScript ...引用在模板類中聲明的結構

我正在使用鏈接列表模板隊列。當我嘗試從withink queue.cpp

//queue.h: 
template <class Object> 
class Queue 
{ 
public: 
    Queue();        // Default 
    Queue(const Queue& original);   // Copy 

    ~Queue();        // Destructor 

    const Queue& operator=(const Queue& rightHandSide); //overloaded op 

    bool isEmpty() const; 

    bool enqueue(const Object& d); 
    bool dequeue(Object& d); 

private: 
    // Node definition 
    struct Node 
    { 
    Object data; 
    Node * next; 
    }; 
    // Queue data members 
    Node * front, * back; 
}; 

因此,讓一個新的節點結構,在我的拷貝構造器我需要一個新的節點我的編譯器不喜歡它。

//queue.cpp 
template <class Object> 
Queue<Object>::Queue(const Queue& original) 
{ 
    if (original.isEmpty()) { 
    front = back = NULL; 
    } else { 
    front = back = new Queue::Node;     //this is line 26 
    front->data = original.front->data; 
    Queue::Node * ptr = original.front->next; 
    while (ptr != NULL) { 
     back->next = new Queue<Object>::Node; 
     back = back->next; 
     back->data = ptr->data; 
     ptr = ptr->next; 
    } 
    } 
} 

queue.cpp: In copy constructor âQueue<Object>::Queue(const Queue<Object>&)â: 
queue.cpp:26: error: expected type-specifier 
queue.cpp:26: error: expected `;' 

任何幫助PLZ?提前致謝。

回答

3

Queue的內部成員函數,您可以直接引用Node

front = back = new Node;     //this is line 26 

Node * ptr = original.front->next; 

你有內環路什麼也都可以工作,其中明確指定模板參數。但是,請注意,由於Node是私有的,除非您將模板實例化爲friend,您必須爲當前實例指定模板參數,因此Queue<Object>::Node沒問題,但Queue<int>::Node不是,除了Queue<int>本身。

+0

是的!謝謝威廉斯先生! – Bobby 2011-04-08 07:24:43

0

一旦複製構造函數啓動,<Object>將隨時需要時與Queue一起隱式添加。對於所有平臺的兼容性,應申報喜歡以下內容:

front = back = new typename Queue::Node; //this is line 26 
0

這裏有一個稍微不同的建議:

// Node is defined within same "class { }", so it needs no "::" qualification 
front = back = new Node; 

在任何情況下,你的代碼給出編譯罰款(http://ideone.com/UrLN0),所以我不知道是否有這裏有什麼別的東西。

沒有模板參數的標識Queue指的是模板本身內部的當前實例。

+0

在C++ 0x中,他需要'Queue :: Node'之前的'typename'。您嘗試的編譯器可能會實現C++ 0x的含義,這意味着您可以將其關閉。 – 2011-04-09 11:56:15

+0

@Johannes:如果沒有使用'::',則不需要'typename',對吧? – Potatoswatter 2011-04-10 01:04:37

1

你的編譯器使用了什麼?你的代碼不應該有任何問題。因爲在班級內使用名稱Queue時,相當於Queue<Object>

這是一個在C++標準,

像正常(非模板)類, 類模板有一個 注入的類名(第9條)。 注入類名可以與 一起使用,也可以不使用模板參數列表。 如果在沒有 模板參數列表的情況下使用它,則它是 等效於注入類名稱 後跟模板參數 包含在<>中的類模板。 當它與一個 模板參數列表使用的,它指的是 指定類模板 特殊化,這可能是 當前專業化或另一個 專業化。