-1

重複の可能性: テンプレートをヘッダー ファイルにしか実装できないのはなぜですか?

Linux で g++ 4.5.5 をコンパイルしているときに次のエラーが発生しましたが、私のコードは Windows で正常に動作すると言われています。

A.o: In function `A::NewObj(int)':
A.cpp:(.text+0x39): undefined reference to `List<A>::Add(A*)'
collect2: ld returned 1 exit status
make: *** [program] Error 1

コードの何が問題なのかわかりません。オブジェクト list_A を正しく宣言したかどうかわかりません。

ファイル:

ああ

#ifndef A_H
#define A_H

class A
{
public:
    int key;
    A() { key=0; }
    A(int i) { key = i; }
    void NewObj(int i);
};

#endif

A.cpp

#include "A.h"
#include "List.h"

static    List<A> *list_A = new List<A>();

void A::NewObj(int i)
{
    A *nobject = new A(i);
    list_A->Add( nobject );

}

List.h

#ifndef LIST_H
#define LIST_H

template<typename Objct>
class Node
{
public:
    Objct* datapiece;
    Node *next, *previous;

    Node() { next = previous = 0; }
    Node ( Objct *object, Node *n = 0, Node *p = 0)
    {
        datapiece = object;
        next = n; previous = p;
    }
};

template<typename Objct>
class List
{
public:
    List() { head = tail = 0; }
    void Add( Objct* );
protected:
    Node<Objct> *head, *tail;
};

#endif

List.cpp

#include "List.h"
#include <iostream>

template<typename Objct>
void List<Objct>::Add( Objct *o )
{
    int i =5;
    Node<Objct> *nnode = new Node<Objct>(o);
    if ( o->key < i )
    std::cout << "Ok" << std::endl;
}

main.cpp

#include <iostream>
#include "A.h"
#include "List.h"

int main()
{
    A *magazyn = new A();
    magazyn->NewObj(6);
}

メイクファイル

CC=g++
CFLAGS=-c -Wall -pedantic

program: List.o A.o main.o
    $(CC) List.o A.o main.o -o program
A.o: A.cpp List.h
    $(CC) $(CFLAGS) A.cpp
List.o: List.cpp
    $(CC) $(CFLAGS) List.cpp
main.o: main.cpp A.h
    $(CC) $(CFLAGS) main.cpp
4

1 に答える 1

1

問題は、テンプレート クラスListは、それを使用するすべてのコンパイル ユニットでメソッドを定義する必要があるという事実です。テンプレートは通常、1 つのヘッダーに 1 つの実装ファイルという規則には従いません。詳細については、この関連する質問を参照してください: テンプレートをヘッダー ファイルにのみ実装できるのはなぜですか?

于 2012-04-22T23:41:45.530 に答える