C++ 带有模板C+的双重列表+;

C++ 带有模板C+的双重列表+;,c++,C++,我试图用head和tail编写我的DoubleList,但在编译过程中编译器显示错误: 错误C2664:“doubleList::addFirst”:无法转换参数1 从“const char[4]”到“std::string&” 有人能帮我吗 #include "stdafx.h" #include <iostream> #include <Windows.h> using namespace std; template<typename T> class

我试图用head和tail编写我的DoubleList,但在编译过程中编译器显示错误:

错误C2664:“doubleList::addFirst”:无法转换参数1 从“const char[4]”到“std::string&”

有人能帮我吗

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
using namespace std;

template<typename T>
class node{
private:
    T field;
    node* previous;
    node* next;
public:
    node(){
        previous = NULL;
        next = NULL;
    }

    node(T& name){
        field = name;
        previous = NULL;
        next = NULL;
    }
};

template<typename T>
class doubleList{
private:
    node<T>* head;
    node<T>* tail;
public:
    doubleList(){
        head = new node<T>;
        tail = new node<T>;
    }
    void addFirst(T& name){
        node<T> *newNode = new node<T>(name);
        if (head->next != NULL){
            nowy->next = head->next;
            (nowy -> next) -> previous = nowy;
        }
        head -> next = nowy;
        nowy->previous = head;
    }

};

int _tmain(int argc, _TCHAR* argv[])
{
    doubleList <string> *train = new doubleList<string>;
    train->addFirst("Ala");

    system("pause");
    return 0;
}
#包括“stdafx.h”
#包括
#包括
使用名称空间std;
样板
类节点{
私人:
T场;
节点*先前;
节点*下一步;
公众:
节点(){
previous=NULL;
next=NULL;
}
节点(T&name){
字段=名称;
previous=NULL;
next=NULL;
}
};
样板
类双重列表{
私人:
节点*头;
节点*尾部;
公众:
双重列表(){
头=新节点;
tail=新节点;
}
void addFirst(T&name){
node*newNode=新节点(名称);
如果(头部->下一步!=NULL){
现在->下一步=头部->下一步;
(nowy->next)->previous=nowy;
}
head->next=nowy;
nowy->previous=头部;
}
};
int _tmain(int argc,_TCHAR*argv[]
{
双重列表*列车=新双重列表;
列车->首先添加(“Ala”);
系统(“暂停”);
返回0;
}

您试图将常量char*传递给引用std::string的方法。编译器没有执行隐式类型转换,因此会抱怨类型不匹配

用另一个接受常量char*的方法重载addFirst方法,显式地将常量char*强制转换为std::string,然后将其传递给现有的addFirst方法


编辑:迈克·西摩的答案比我的好。此常量引用示例似乎是您案例中的最佳选择。

构造函数以及
addFirst
通过非常量左值引用获取其参数,这意味着在本例中只能使用正确类型的左值-
字符串来调用它。您试图用一个由不同类型构造的临时右值来调用它

将它们更改为按值、常量或转发引用获取参数,并允许传递临时参数:

node(T name)          // value
node(T const & name)  // const reference
node(T && name)       // forwarding reference

const char*
std::string
的隐式转换工作正常。是的,但是从
const char*
std::string&
的隐式转换不起作用,这里就是这种情况。但是,正如Mike所指出的,隐式转换到
const std::string&
效果很好。当然,它是隐式的,所以不需要显式转换它。通常,如果不需要修改参数,请将其设置为
const
。这使调用者不必在设计糟糕的界面周围工作,比如
main
在这里就必须这样做。还要确保释放所有动态分配的内存
main
不需要指针或
new