3

私のコンパイラは、私が完全に理解できないこのインスタンス化エラーで私を苦しめています。

私はテンプレートクラスlistItemを持っています:

template <class T>
class tListItem{
    public:
        tListItem(T t){tData=t; next=0;}
        tListItem *next;
        T data(){return tData;}
    private:
        T tData;
};

たとえば、次のような非プリミティブデータ型でオブジェクトを初期化しようとすると:

sPacket zomg("whaever",1);
tListItem<sPacket> z(zomg);

私のコンパイラは常にこのエラーをスローします.エラーはプリミティブ型ではスローされません。

コンパイラからの出力は次のとおりです。

../linkedList/tListItem.h: In constructor ‘tListItem<T>::tListItem(T) [with T = sPacket]’:
recvBufTest.cpp:15:   instantiated from here

../linkedList/tListItem.h:4: error: no matching function for call to ‘sPacket::sPacket()’

../packetz/sPacket.h:2: note: candidates are: sPacket::sPacket(const char*, int)

../packetz/sPacket.h:1: note:                 sPacket::sPacket(const sPacket&)

私はあなたに迷惑をかけませんが、私は何か愚かなことで2時間を過ごしたくありません.....

4

3 に答える 3

3

現状では、コードには T 型の既定のコンストラクターが必要です。テンプレート コンストラクターを次のように変更します。

 tListItem(T t)  : tData(t), next(0) {}

違いは、バージョンのデフォルトが T 型のインスタンスを構築してからそれに割り当てることです。私のバージョンでは初期化リストを使用してインスタンスをコピーするため、デフォルトのコンストラクターは必要ありません。

于 2009-12-06T17:32:41.057 に答える
0

GCC は、複数の場所にある問題を説明するために、エラー メッセージを複数のレポートに分割できます。これらのメッセージを 1 つのメッセージとして読む必要がある場合もあれば、このメッセージの前にあるメッセージを理解する必要がある場合もあります。

また、コード マークアップでログを投稿して、逐語的に表示されるようにします。

于 2009-12-06T18:24:49.383 に答える
0

私はこれを自分のシステムでビルドしました。間違っている可能性がありますが、問題は sPacket のデフォルトのコンストラクターがないことだと思います。

クラス sPacket {

公衆:

sPacket() { } //空のデフォルト コンストラクタ

sPacket(文字列 s, int a) {s=s; a=a;}

};

これがお役に立てば幸いです。

于 2009-12-06T17:43:47.763 に答える