我的功能声明是
siteObject(std::string& url, std::string& get, std::string& post);
为什么这是site("String 1", "String 2", "String 3")
;创建不匹配类型错误。它说它想要一个字符串引用,并且它正在接收一个char数组。如果您需要更多细节,请在评论中提问。
答案 0 :(得分:6)
因为对std::string
构造函数有一个隐式调用,它会创建一个临时对象。你不能对非临时引用非const引用(因为修改临时修改没有意义)。
因此,要么修改函数以获取const
引用,要么修改值,或者将其传递给非临时对象。
答案 1 :(得分:3)
您的siteObject
功能:
siteObject(std::string& url, std::string& get, std::string& post);
对字符串对象进行非const引用,这些对象不能绑定到右值(或临时值)。
当您尝试使用字符串文字调用该函数时,编译器必须将这些参数(char*
)转换为与参数类型匹配的内容 - 该转换将导致临时std::string
对象
如果您希望能够将它们绑定到临时对象,则需要更改函数以接受const引用:
siteObject(std::string const& url, std::string const& get, std::string const& post);
或者您可以传递值而不是引用:
siteObject(std::string url, std::string get, std::string post);
答案 2 :(得分:1)
正确的电话是:
std::string url("...");
std::string get("...");
std::string post("...");
siteObject(url, get, post);
这是有道理的,因为方法签名意味着你在三个字符串(非const引用)中得到了一些东西,你可以使用这些返回值。
如果这不是意图,你可以更改siteObject()方法,那么你应该这样做:
siteObject(std::string const & url, std::string const & get, std::string const & post);
并使用您的原始电话。
答案 3 :(得分:1)
您需要使函数接受const std::string& str
或构造字符串实例以传入,而不是依赖于将char *隐式转换为字符串对象。
答案 4 :(得分:0)
以双引号字符输入的字符串来自C ++的C遗产(它们被称为C字符串或NUL终止字符串)。它们由编译器实现为char
的数组。相反,std::string
是一个C ++类,旨在简化字符串的操作。它拥有一个C字符串(可以从一个字符串创建,因为它有一个接受const char*
的构造函数),并管理它的内存。
由于存在来自std::string
的{{1}}的构造,并且C字符串与该类型兼容,为什么编译器无法调用此函数?这是因为该函数对const char*
个对象进行非const引用。构造函数不能在这种情况下使用,因为创建的对象是临时对象,并且你不能获得对临时对象的非const引用,因为被调用的函数可能会改变它。
您可以创建std::string
并将其传递给函数:
std::string
或者您可以更改std::string s1("String 1");
std::string s2("String 2");
std::string s3("String 3");
site(s1, s2, s3);
函数的原型以接受const引用。只有当函数不改变对象并且您可以访问代码时,才可以执行此操作:
site