0

データ構造クラスの一般的なリストを書いていますが、カスタム テンプレートに問題があると思います。私はこのコードを持っています

ListNode.h

#ifndef LISTNODE_H
#define LISTNODE_H

#include <iostream>
using std::ostream;

template <class Datatype>
class ListNode
{
public:
    ListNode(Datatype data);
    ListNode<Datatype>* next() const;
    void next(ListNode* next);
    ListNode<Datatype>* previous() const;
    void previous(ListNode* previous);
    Datatype data() const;
    void data(Datatype data);
    void write(ostream& out) const;

private:
    ListNode<Datatype>* m_next;
    ListNode<Datatype>* m_previous;
    Datatype  m_data;
};

template <class Datatype>
ostream& operator << (ostream& out, const ListNode<Datatype>& node);

#endif  /* LISTNODE_H */

ListNode.cpp

#include <iostream>
using std::ostream;

#include "include/List/ListNode.h"

template <class Datatype>
ListNode<Datatype>::ListNode(Datatype data)
{
    m_data = data;
    m_previous = 0;
    m_next = 0;
}

template <class Datatype>
ListNode<Datatype>* ListNode<Datatype>::next() const
{
    return m_next;
}

template <class Datatype>
void ListNode<Datatype>::next(ListNode<Datatype>* next)
{
    m_next = next;
}

template <class Datatype>
ListNode<Datatype>* ListNode<Datatype>::previous() const
{
    return m_previous;
}

template <class Datatype>
void ListNode<Datatype>::previous(ListNode<Datatype>* previous)
{
    m_previous = previous;
}

template <class Datatype>
Datatype ListNode<Datatype>::data() const
{
    return m_data;
}

template <class Datatype>
void ListNode<Datatype>::data(Datatype data)
{
    m_data = data;
}

template <class Datatype>
void ListNode<Datatype>::write(ostream& out) const
{
    out << m_data;
}

template <class Datatype>
ostream& operator << (ostream& out, const ListNode<Datatype>& node)
{
    node.write(out);
    return out;
}

main.cpp

#include <iostream>
using std::cout;
using std::endl;

#include "include/List/ListNode.h"

int main(int argc, char** argv) 
{
    ListNode<int> node(10);

    cout << node;

    return 0;
}

したがって、コンパイルしようとすると、次のようになります。

main.cpp:9: `ListNode::ListNode(int)' への未定義の参照

main.cpp:9:(.text+0x21): 適合するように切り捨てられた再配置: R_X86_64_PC32 に対する未定義のシンボル `ListNode::ListNode(int)'

誰かが私が間違っていることを教えてくれたら幸いです

4

1 に答える 1

0

それは非常に簡単です。ヘッダー ファイルにテンプレート コードを配置する必要があります。そうしないと、リンク エラーが発生します。テンプレート コードは特別です。コンパイラは、テンプレートが使用されている時点で、テンプレートの定義 (宣言だけでなく) を知る必要があります。したがって、すべてのテンプレート コードはヘッダー ファイルに入れる必要があります。

詳しくはこちらをご覧ください。

ListNode.cpp を削除し、すべてのコードを ListNode.h に入れます。

于 2013-09-22T10:38:35.157 に答える