1

私はC++の初心者ですので、以下の間違いがばかげていることが判明した場合は、すみません。それでも、私は自分のコードで立ち往生しているので、助けていただければ幸いです。

g ++経由でmakeを介してコンパイルしようとすると、次のエラーが発生します。

In file included from A.cpp:2:
List.h:20: error: ‘List’ is not a template type
A.cpp: In member function ‘void A::NowyObiekt(int)’:
A.cpp:6: error: ‘list_a’ was not declared in this scope
make: *** [A.o] Error 1

私のコードは次の小さなファイルに分かれています。

  • ああ: http: //pastebin.com/QQ04xx2j(ヘッダー)
  • A.cpp:以下

    #include "A.h"
    #include "List.h"
    
    void A::NewObject(int i)
    {
            list_a.Add(i);
    }
    
    int A::Compare(int a, int b)
    {
            if ( a>b ) return 1;
            if ( a<b ) return -1;
            else return 0;
    }
    
  • List.h:以下(ヘッダー)

    #ifndef LIST_H
    #define LIST_H
    template<typename T>
    class Node
    {
        Node()
        {
            nxt = pre = 0;
        }
        Node(const T& el, Node *n = 0, Node *p = 0 )
        {
            dana = el; nxt = n; pre = p;
        }
        T dana;
        Node *nxt, *pre;
    };
    
    template<typename T>
    class List
    {
    public:
        List()
        {
            head = tail = 0;
        }
        void Add(const T&);
    protected:
        Node<T> *head,*tail;
    };
    
    #endif
    
  • List.cpp: http: //pastebin.com/a3HQ9yZ4

  • prog.cpp:以下(メイン)

    #include "List.h"
    #include "A.h"
    
    int main()
    {
        int i = 5;
        class List list_a;
        class A obj;
    
        obj.Add(i);
    }
    
  • そしてmakefileは: http: //pastebin.com/GTR5jW54

先ほど申し上げましたように、私はまだ初心者ですので、ご理解ください。助けと明確な説明をいただければ幸いです。前もって感謝します。

4

1 に答える 1

4

コードにはいくつかの問題があります。1つは、どこにも名前の付いた変数を宣言しないことですlist_a。そのエラーはかなり明白なはずです。もう1つは、Listテンプレートパラメータを指定せずにクラスを使用することです。

そして、あなたの質問についての最後の小さなメモ:あなたのファイルは確かに非常に小さいので、あなたはそれらを質問に入れて、それらにリンクしないことができます。

編集:List テンプレートの問題について。

ですでにNode適切に使用しています。Listつまり、ノードをとして宣言しNode<T>ます。あなたが使うとき、あなたはList単に同じことをしなければなりません。たとえば、整数のリストを宣言するには、次のようにします。

List<int> my_int_list;

Listまた、クラスのパブリック関数のみを使用するため、宣言Aは必要ありません。保護されたメンバーまたはプライベートメンバー(IMOは悪い設計の兆候です)を使用する必要がある場合は、そのフレンド宣言もテンプレート化する必要がありますfriend

friend class List<sometype>;

そして最後に、コードはとにかくコンパイルされません...その理由は、テンプレートクラスを使用している場合、クラス全体を完全に定義する必要があるためです(つまり、関数の実装を完了している必要があります)。これは、関数をヘッダーファイルに入れることで解決できます。また、関数を定義するときは、そこにもテンプレートパラメータが必要です。

template<typename T>
void List<T>::Add(const T& el)
{
    Node<T>* head = new Node<T>(el);
    if ( Compare(el,i) > i )
        std::cout << "Ok" << std::endl;
}

テンプレートパラメータをいくつかの場所に追加したことに注意してください。

于 2012-04-19T05:18:05.377 に答える