C++ 带有模板C+的双重列表+;
我试图用head和tail编写我的DoubleList,但在编译过程中编译器显示错误: 错误C2664:“doubleList::addFirst”:无法转换参数1 从“const char[4]”到“std::string&” 有人能帮我吗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
#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
。