从这里实例化错误

时间:2009-12-06 17:28:51

标签: c++ templates instantiation

我的编译器用这个实例化错误折磨我,我完全不明白。

我有模板类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&)

我不会打扰你,但我不想花两个小时愚蠢.....所以你回复所有答案

3 个答案:

答案 0 :(得分:3)

目前,您的代码需要类型T的默认构造函数。将模板构造函数更改为:

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

不同之处在于您的版本默认构造了类型为T的实例,然后分配给它。我的版本使用初始化列表来复制构造实例,因此不需要默认构造函数。

答案 1 :(得分:0)

我得到这个建立在我自己的系统上,我可能是错的,但我认为你的问题是没有sPacket的默认构造函数:

  

class sPacket {

     

公共:

     

sPacket(){} //清空默认构造函数

     

sPacket(string s,int a){s = s; A = A;}

     

};

我希望这有用!

答案 2 :(得分:0)

GCC可以跨多个报告拆分错误消息,以描述具有多个位置的问题。您可能需要将消息作为单个消息阅读,甚至可能需要在此消息之前的消息才有意义。

同时在代码标记中发布日志以强制它逐字显示。