

リンクリストのメソッドをテンプレートを使い定義したいです。自分は以下のようなコードを作りましたが、ある問題が発生しました。それは、addHead()をソースファイル（cppファイル）に定義すると正常にコンパイルできないのです。しかしながら、まったく同じものをヘッダーファイル（hファイル）に定義すると正常にコンパイルできるようになるのです。  
また、ソースファイルに定義すると次のようなエラーが出てしまいます。

[code]

    error LNK2019: 未解決の外部シンボル "public: void __thiscall List<int>::addHead(int)" (?addHead@?$List@H@@QAEXH@Z) が関数 _main で参照されました
    lab9.exe : fatal error LNK1120: 1 件の未解決の外部参照
    
[/code]

私の考えはLinkクラスがList.cppでうまく参照されてないのではないかと思っているのですが、何も根拠はありません。  
何とかしてソースファイルにリンクリストのメソッドを定義したいのですがどなたかアドバイスお願いしましす。  
追記：CLionをつかってコードしました。

main.cpp

[code]

    #include <iostream>
    #include "List.h"
    
    using namespace std;
    
    int main() {
    
        int size = 5;
        List<int> numbers;
        for(int i = 0; i < size; i++)
        {
            numbers.addHead(i);
        }
    
        cout << numbers.showList();
        return 0;
    }
    
[/code]

List.h

[code]

    #include <string>
    
    using std::string;
    
    
    template <typename T>
    class Link
    {
    private:
        T value;
        Link* next;
    public:
        //constructor
        Link(T value, Link* next = nullptr): value(value), next(next){}
        //destructor
        virtual ~Link(){}
        //return value
        T getValue(){return this->value;}
        //return next
        Link* getNext(){return this->next;}
        //set next
        void setNext(Link* next){this->next = next;}
    };
    
    template <typename T>
    class List
    {
    private:
        Link<T>* head;
    public:
        List():head(nullptr){}
        //virtual ~List();
        void addHead(T value);
    
        //for testing
        
        string showList()
        {
            string buffer = "";
            if(head == nullptr)
            {
                buffer = "Nothing in the List";
            }
            else
            {
                buffer = "Head -> ";
                for(Link<T>* currentLink = head; currentLink; currentLink = currentLink->getNext())
                {
                    buffer += std::to_string(currentLink->getValue());
                    buffer += " -> ";
                }
                buffer += "nullptr";
            }
            return buffer;
        }
        
    };
    
[/code]

List.cpp

[code]

    #include "List.h"
    
    
    template <typename T>
    void List<T>::addHead(T value)
    {
        Link<T>* theLink;
        theLink = new Link<T>(value);
        theLink->setNext(head);
        head = theLink;
    }
    
[/code]


CC BY-SA 4.0
2021-05-28T06:03:00.553
76142
2021-05-28T07:18:29.933
2021-05-28T07:18:29.933
45177
45177
question
c++
リンクリストのメソッドをテンプレートを使い定義したい


ご想像通り「List.cpp」がコンパイルもリンクもされていないのではないでしょうか。

・対処方法は構築環境によって異なりますので、それを追記するとより適切な回答がえられると予想できます。

例として、Visual Studioを使っている場合の追加の手順の概要を示します。

  1. ソリューションエクスプローラの当該プロジェクトを右クリックする。
  2. コンテキストメニューから「追加(D)」の「既存の項目(G)」を選択する。
  3. 「既存の項目の追加」DLGで「List.cpp」を選択して「OK」
  4. ソリューションエクスプローラに「List.cpp」が表示されます。

確認出来たら「リビルド」してみましょう。


CC BY-SA 4.0
2021-05-28T06:20:43.897
76143
2021-05-28T07:14:03.643
2021-05-28T07:14:03.643
3060
3793
76142
answer