查看以下代码
标题文件:
class CxUser
{
public:
CxUser(string& guid) {}
};
我有一个使用CxUser(string("xxx-xxx-x-xxxx"))
实例化该类的c ++文件。但是这个语句无法用g ++编译,错误“ 没有匹配函数来调用CxUser :: CxUser(std :: string) ”,而它在VC ++中编译。令人惊讶的是,下面的一段代码实例化了这个类。
string guid("xxx-x-xxxx-xxx-xx"); CxUser user(guid);
任何帮助都将不胜感激....
答案 0 :(得分:12)
你需要:
class CxUser{ public: CxUser(const string& guid) {} }
当你说:
CxUser c( "foobar" ); // or whatever
从characterv数组创建临时字符串对象。在C ++中,您不能将非const引用绑定到临时对象。
答案 1 :(得分:2)
您要求传递对字符串的引用 - 实质上是指向存储它的位置的指针。但是当你创建这样的匿名临时时,它并没有被存储在任何地方---“那里没有” - 没有什么可以通过的。通过将其存储在指定的临时文件中,您可以为其提供一个可以使用的位置。
当您使用非const引用作为参数时,您暗示您将更改不存在的引用,因此您无法更改它。当你使用const引用时,编译器知道你不能改变它,所以它可以做一些魔术,以便匿名临时引用参数工作。
答案 2 :(得分:1)
我认为如果你让构造函数接受const std::string&
,那么CxUser(string("xxx-xxx-x-xxxx"))
就可以了。