2009-06-26 85 views
2

我編譯G ++我不能編譯C++

#include <iostream> 
#include <string> 
using namespace std; 
template<class T> 
class Node<const char*>{ 
private: 
    string x_; 
    Node* next_; 
public: 
    Node (const char* k, Node* next):next_(next),x_(k){} 
    string data(){return x_;} 
    Node *get_next(){return next_;} 
}; 

$ g++ -c node01.cc 
node01.cc:5: error: ‘Node’ is not a template 

怎麼了以下電源線使用的模板? 我對C++

回答

6

你混淆了聲明和實例初學者。當你聲明一個模板時,你不需要在它的名字後面指定一個類型。相反,聲明它是這樣的:

template<class T> 
class Node { 
private: 
    const T x_; 
    Node *next_; 
public: 
    Node (const T& k, Node *next) : x_(k), next_(next) { } 
    const T& data(){return x_;} 
    Node *get_next(){return next_;} 
}; 

你原來的宣言還混淆stringconst char *和泛型類型,應該是在T條款。對於這樣的模板,您可能希望讓用戶定義成員的類型(x_)。如果您明確聲明它爲const char *string,那麼通過限制用戶可用於T的內容即可失去通用性。

請注意,我也將實例變量的類型,構造函數的參數和返回類型data()更改爲T

當實際實例化模板類型的變量,就可以提供一個具體的類型參數,例如

int main(int argc, const char **argv) { 
    Node<char*> *tail = new Node<char*>("tail", NULL); 
    Node<char*> *node = new Node<char*>("node", tail); 
    // do stuff to mynode and mytail 
} 

每當你寫的模板聲明外模板名稱Node,它沒有完成,直到你提供的參數T值。如果你只是說Node,編譯器將不知道你想要的節點的種類

上面的是一個有點冗長,所以你也可以用一個typedef簡化它,當你真正使用它:

typedef Node<char*> StringNode; 
int main(int argc, const char **argv) { 
    StringNode *tail = new StringNode("tail", NULL); 
    StringNode *node = new StringNode("node", tail); 
    // do stuff to mynode and mytail 
} 

現在你已經建立了兩個節點的鏈接列表。您可以打印出列表中的所有值像這樣的東西:

for (StringNode *n = node; n; n = n->get_next()) { 
    cout << n->data() << endl; 
} 

如果一切順利,這將打印出:

node 
tail 
2

類聲明應該是這樣的:

template<class T> 
class Node{ 
private: 
    T x_; 
    Node* next_; 
public: 
    Node (const T& k, Node* next):next_(next),x_(k){} 
    T data(){return x_;} 
    Node *get_next(){return next_;} 
}; 

請注意我如何刪除對stringconst char *的所有引用,並將其替換爲通用類型T。你的班級,因爲它是模板化的,不應該引用任何特定的類型,而應該按照通用的T類型做所有事情。

const char *在聲明Node變量後指定。或者它可以是任何其他類型,而不僅僅是const char *。關鍵是,當您聲明Node類時,您只需在代碼中使用通用類型T,而不參考任何特定類型。只有在實際使用Node時才指定特定類型。

Node<const char *> stringNode("foo", NULL); 
Node<int>   intNode(5, NULL); 

這使我們有Node類的單一定義,但可以使用它來創建兩個節點,其中數據是一個字符串和節點,其中數據是一個整數。萬歲模板!