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

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

类 sPacket {

上市:

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

sPacket(字符串 s, int a) {s=s; 一个=一个;}

};

我希望这是有帮助的!

于 2009-12-06T17:43:47.763 回答
0

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

还要在代码标记中发布日志以强制其逐字显示。

于 2009-12-06T18:24:49.383 回答