错误:没有用于初始化'List <double> :: node'</double>的匹配构造函数

时间:2014-02-10 06:42:04

标签: c++ templates

因此,对于一个项目,我使用带有头尾指针的链表实现了一种列表作为模板类。当我构建列表时,我使用以下代码

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类型返回正确的值,所以我很难理解为什么编译器不喜欢这个。

我很确定有更好的方法可以做到这一点,但有人能够提供解决方案来修复这段特定的代码吗?任何答案都表示赞赏。

1 个答案:

答案 0 :(得分:0)

您可以在处理teplates时调用template参数的构造函数来初始化对象。你不需要typeid。 你可以写

head = new node(Item(), NULL, NULL);
tail = new node(Item(), NULL, NULL);

只有您需要注意的是,您使用的类型必须具有默认构造函数,并且必须是可复制的

这样你的字符串将被初始化为空字符串