你混淆了聲明和實例初學者。當你聲明一個模板時,你不需要在它的名字後面指定一個類型。相反,聲明它是這樣的:
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_;}
};
你原來的宣言還混淆string
,const 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