2013-02-01 92 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)); '。如果您遇到了一些特定的代码,我建议您提出一个新的问题。 –