2010-08-04 92 views
0

参考参数看一看在下面的代码段构造与以g ++编译器

头文件:

class CxUser 
{ 
public: 
    CxUser(string& guid) {} 
}; 

我有一个C++文件,使用CxUser(string("xxx-xxx-x-xxxx"))实例化的类。但是这个语句无法在g ++中编译,错误“没有匹配函数调用CxUser :: CxUser(std :: string)”,而它使用VC++编译。令人惊讶的是,下面这段代码来实例化类的作品。

string guid("xxx-x-xxxx-xxx-xx"); CxUser user(guid); 

任何帮助,将不胜感激....

+0

你能发布错误信息吗? – doron 2010-08-04 13:37:00

+0

用错误消息编辑 – Prabhu 2010-08-04 13:38:42

回答

12

您需要:

class CxUser{ public: CxUser(const string& guid) {} } 

当你说:

CxUser c("foobar"); // or whatever 

一个临时字符串对象从characterv创建阵列。在C++中,您不能将非const引用绑定到临时对象。

2

您正在要求传递一个字符串的引用 - 实质上是一个指向它存储位置的指针。但是当你像这样创建匿名临时文件时,它不会存储在任何地方---“那里没有” - 没有任何可以传递的东西。通过将其存储在指定的临时文件中,您可以为其提供一个位置。

当您使用非const引用作为参数时,意味着您将更改不存在的引用,因此您无法更改它。当你使用const引用时,编译器知道你不能改变它,所以它可以做一些魔术,这样匿名临时引用参数就可以工作。

+0

如果是这样的话,你不能在一个临时的(它接收到一个非const的this指针)上调用非const成员,但你可以。 – 2010-08-04 13:46:31

+0

@本:不合法,不。 – 2010-08-04 13:51:18

+0

@Konrad:你是说你不能合法地在非临时性的会员上打电话吗? – 2010-08-04 14:23:21

1

我认为如果你让构造函数接受const std::string&那么CxUser(string("xxx-xxx-x-xxxx"))应该工作。

+1

你的意思是'const std :: string&'(当然它的工作原理没有参考) – UncleZeiv 2010-08-04 13:48:07

+0

嗯。无论何时你传递一个非POD值,你都应该通过引用或指针传递它。 – 2010-08-04 13:59:33