1

Visual Studio 2010 Pro で次のエラーが発生します:「エラー C2953: 'list_1::Node': クラス テンプレートは既に定義されています」

これは、エラーが発生している Node.cpp クラス リストです (コードの最後の行である 24 行目)。

#include "Node.h"

namespace list_1
{
    template <typename T>
    struct Node
    {
        //Constructor
        Node<T>(T D)
        {
            data = d;
            next = NULL;        
        }
    }
;}

そして Node.H ファイル:

#pragma once

namespace list_1
{
    template <typename T>
    struct Node
    {
        T data;
        Node<T> *next;

        // Constructor
        // Postcondition: 
        Node<T> (T d);
    };
}

すでに#pragma once を使用しているため、これは役に立ちません。リスト ヘッダー ファイルには、#ifndef LIST_H と #define LIST_H がありますこの質問は私のニーズに合わず、この回答のすべては、私が既に持っているテンプレート ビットを持っていることに関連しているようです。

構造体ノードにしようとすると、「エラー C2753: 'list_1::Node': 部分的な特殊化がプライマリ テンプレートの引数リストと一致しません」というエラーが表示されます。

だから私は何をすべきか途方に暮れています。助けてください。

4

2 に答える 2

2

通常の (非テンプレート) クラスの場合、次のようにします。

//whatever.h
namespace Y 
    class X {
    public:
        X();
    };
}

次に、cpp ファイルには、次のようなものがあります。

namespace Y { 
    X::X() { /* ... */ }
}

ただし、テンプレートの場合、通常、コンパイラが使用する場所に実装を配置する必要があります。これは通常、ヘッダーにも配置することを意味します。その場合、かなりの数の人々が定義をクラス定義内のインライン定義として記述します。

namespace Y { 
    template <class T>
    class X {
    public:
        X(T d) { /* ... */ }
    };
}

必要に応じて、クラス定義の外で関数を定義できますが、とにかくヘッダーになるため、実際には多くのことを達成できません (少なくとも典型的なケースでは)。

于 2013-01-27T05:47:25.387 に答える
1

私はあなたのコンパイラに同意します..あなたはstruct二度定義しています。

修正するには -

ヘッダーから削除します。

.cpp は次のようになります。

#include "Node.h"

namespace list_1
{
    //Constructor
    template<typename T>
    Node<T>::Node(T D){
        ...
    }
}

基本的に、構造体ブロックはヘッダーにのみ表示されます。

さらに、ファイル内のテンプレート クラス メンバーの定義に関する問題を認識しているかどうか疑問に思います.cpp

于 2013-01-27T05:41:55.660 に答える