-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 &)" (?CreateNode@?
 $LinkedList@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@@AAE?AV?
 $shared_ptr@V?$LinkedList@V?$basic_string@DU?$char_traits@D@std@@V?
 $allocator@D@2@@std@@@@@tr1@std@@ABV?$basic_string@DU?$char_traits@D@std@@V?
 $allocator@D@2@@4@ABV1@@Z)
 fatal error LNK1120: 1 unresolved externals
 1>
 1>Build FAILED.

私はテンプレートの使用にかなり慣れていないため、正式に学習したのではなく、章を読むのではなく、ウェブをハックアンドスラッシュしました。このコードのどこに問題があり、可能な限り最もプロフェッショナルなコードを生成するにはどのような修正を行う必要がありますか?

4

2 に答える 2

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));
}
于 2013-02-01T13:41:50.023 に答える
1

LinkedList<T>::クラス定義の外でメンバー関数を定義するときは、メンバーであることを示すためにメンバー名を修飾する必要があります。それ以外の場合は、代わりに新しい非メンバー関数を宣言します。

CreateNodeとの定義の修飾を忘れましたLinkFactory:

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));
}
于 2013-02-01T13:46:19.120 に答える