由此实例化错误

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&)

我不想打扰你,但我也不想花两个小时在一些愚蠢的事情上......所以感谢你所有的回复。
3个回答

3

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

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

您的版本会默认构造一个T类型的实例,然后再对其进行赋值。我的版本使用初始化列表来拷贝构造实例,因此不需要默认构造函数。

好的,它能工作,但仍然会抛出一些警告,但我仍然不确定为什么它不能以相同的方式工作...我的版本也应该使用默认的复制构造函数。 - Pyjong
1
如果你的类被实例化,会调用其成员的默认构造函数,除非你在构造函数列表中初始化它们。如果其中某个成员类型无法进行默认构造,将导致失败。 - pmr
1
不应该这样。它将使用默认的赋值运算符,并且需要一个默认构造函数。 - anon
哦,是的!现在我明白了。非常感谢,你帮我节省了很多时间来解决这个问题。 - Pyjong
@stupid_idiot:如果你使用了常规做法——我更喜欢成员初始化列表而不是赋值——你就不会出错了。 - Naveen
什么?你是说像尼尔·B.宣布的那样吗? - Pyjong

0

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

class sPacket {

public:

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

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

};

希望这有所帮助!


提供一个不必要的默认构造函数总是一个坏主意。巧合的是,我刚在http://punchlet.wordpress.com/上写了一篇关于这个问题的博客。 - anon
我没有意识到,谢谢你的评论!你的帖子非常有趣。 - HappyCodeMonkey

0
GCC可以将错误信息分成多个报告,以描述具有多个位置的问题。您可能需要将消息作为单个消息阅读,甚至可能需要前面的消息才能理解其含义。
此外,请在代码标记中发布日志,以强制它以逐字方式显示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接