因此,对于一个项目,我使用带有头尾指针的链表实现了一种列表作为模板类。当我构建列表时,我使用以下代码
template <class Item>
List<Item>::List()
{
if (typeid(Item) == typeid(string))
{
head = new node("0", NULL, NULL);
tail = new node("0", NULL, NULL);
}
else
{
head = new node(0, NULL, NULL);
tail = new node(0, NULL, NULL);
}
head->next = tail;
tail->prev = head;
cursor = head;
size = 0;
}
typeid if语句在那里,如果我正在创建一个字符串列表,节点构造函数将收到一个正确的字符串值,编译器将不会抛出拟合。这工作正常,但是当我编辑我的代码以便它也会初始化一个双打列表时,编译器抛出了这个错误:
/List.h:59:21:错误:没有用于初始化'List :: node'的匹配构造函数 head = new node(“0”,NULL,NULL);
据我所知,编译器忽略了我放置的if语句,但我不知道为什么。如果我删除代码以允许字符串并只使用else块中的语句然后双精度,整数,字符等工作正常,但然后字符串将无法正常工作。我已经验证了if语句正在为Item类型返回正确的值,所以我很难理解为什么编译器不喜欢这个。
我很确定有更好的方法可以做到这一点,但有人能够提供解决方案来修复这段特定的代码吗?任何答案都表示赞赏。
答案 0 :(得分:0)
您可以在处理teplates时调用template参数的构造函数来初始化对象。你不需要typeid。 你可以写
head = new node(Item(), NULL, NULL);
tail = new node(Item(), NULL, NULL);
只有您需要注意的是,您使用的类型必须具有默认构造函数,并且必须是可复制的
这样你的字符串将被初始化为空字符串