2013-02-01 91 views
-1

下面是代碼:鏈接錯誤 - 新模板

#ifndef LINKED_LIST_H_ 
#define LINKED_LIST_H_ 

#include<memory> 

template <class T> 
class LinkedList{ 
public: 
// 
LinkedList() {} 
LinkedList(const T &data); 
LinkedList(const T &data, LinkedList &node); 
LinkedList(const LinkedList &object); 
LinkedList &operator=(const LinkedList &object); 

~LinkedList() {} 

std::shared_ptr<LinkedList> push_back(const T& data); 

private: 
T data; 
std::unique_ptr<LinkedList> link; 

std::unique_ptr<LinkedList> LinkFactory(const LinkedList &node); 

std::shared_ptr<LinkedList> CreateStartNode(const T &data); 
std::shared_ptr<LinkedList> CreateNode(const T &data, const LinkedList &node); 
}; 
// 
template <typename T> 
LinkedList<T>::LinkedList(const T &data) : data(data), link(nullptr) {} 
template <typename T> 
LinkedList<T>::LinkedList(const T &data, LinkedList &node) : data(data) { this->link =   
LinkFactory(node); } 
template <typename T> 
LinkedList<T>::LinkedList(const LinkedList<T> &object) : data(object.data)  
link(object.link) {} 
template <typename T> 
LinkedList<T>& LinkedList<T>::operator=(const LinkedList<T> &object){ 
data = object.data; 
link = object.link; 
return *this; 
} 

template <typename T> 
std::unique_ptr<LinkedList<T>> LinkFactory(const LinkedList<T> &node){ 
return std::unique_ptr<LinkedList<T>>(new LinkedList(node)) 
} 
// 
template <typename T> 
std::shared_ptr<LinkedList<T>> LinkedList<T>::CreateStartNode(const T &data){ 
return std::shared_ptr<LinkedList<T>>(new LinkedList(data)); 
} 
// 
template <typename T> 
std::shared_ptr<LinkedList<T>> CreateNode(const T &data, const LinkedList<T> &node){ 
return std::shared_ptr<LinkedList<T>>(new LinkedList(data, node)); 
} 

template <typename T> 
std::shared_ptr<LinkedList<T>> LinkedList<T>::push_back(const T &data){ 
// 
if(this == 0){ 
    // create new node 
    return CreateStartNode(data); 
}else{ 
    // add a node 
    return CreateNode(data, *this); 
} 
} 

#endif 

這裏是連接錯誤:

error LNK2001: unresolved external symbol "private: class std::tr1::shared_ptr<class 
LinkedList<class std::basic_string<char,struct std::char_traits<char>,class 
std::allocator<char> > > > __thiscall LinkedList<class std::basic_string<char,struct 
std::char_traits<char>,class std::allocator<char> > >::CreateNode(class 
std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > 
const &,class LinkedList<class std::basic_string<char,struct 
std::char_traits<char>,class std::allocator<char> > > const &)" ([email protected]? 
[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@@AAE?AV? 
[email protected][email protected][email protected][email protected]@[email protected]@V? 
[email protected]@[email protected]@[email protected]@@@@[email protected]@@[email protected][email protected]@[email protected]@V? 
[email protected]@[email protected]@[email protected]@@Z) 
fatal error LNK1120: 1 unresolved externals 
1> 
1>Build FAILED. 

我是相當新的模板使用,並沒有正式地學習它,而是黑客通過網絡而不是閱讀一章。我在哪裏出錯了這個代碼,並且必須修改哪些代碼才能生成最專業的代碼?

+0

你有在同一文件中的一切嗎? –

回答

1

你CreateNode函數的定義是不是在LinkedList的範圍。

此致

template <typename T> 
std::shared_ptr<LinkedList<T>> 
CreateNode(const T &data, const LinkedList<T> &node) 
{ 
return std::shared_ptr<LinkedList<T>>(new LinkedList(data, node)); 
} 

應該

template <typename T> 
std::shared_ptr<LinkedList<T>> 
LinkedList<T>::CreateNode(const T &data, const LinkedList<T> &node) 
{ 
return std::shared_ptr<LinkedList<T>>(new LinkedList(data, node)); 
} 
1

當你定義一個成員函數類定義之外,你需要LinkedList<T>::來限定成員名稱,以表明它是一個成員;否則,它會聲明一個新的非成員函數。

你已經忘記對CreateNodeLinkFactory定義資格:

template <typename T> 
std::unique_ptr<LinkedList<T>> LinkedList<T>::LinkFactory(const LinkedList<T> &node){ 
//     Add this ^^^^^^^^^^^^^^^ 
    return std::unique_ptr<LinkedList<T>>(new LinkedList(node)); 
} 
+0

謝謝大家......我以'LinkedList ::'爲前綴,但沒有這個。這是另一個問題。我清理了剩下的編譯時問題,並且可怕的unique_ptr no copy/no assign已經彈出,並且我不熟悉移動構造函數或隱藏拷貝構造函數的問題又一次浮出水面。你有什麼建議或建議嗎? – user633658

+0

@ user633658:一般來說,如果你想傳遞一個對象的移動構造函數(或其他任何預期的* *右值引用),那麼你需要明確地移動它:'感動的事情(的std ::移動(old_thing)); '。如果您遇到了一些特定的代碼,我建議您提出一個新的問題。 –