Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在g+中具有引用参数的构造函数+;编译程序_C++ - Fatal编程技术网

C++ 在g+中具有引用参数的构造函数+;编译程序

C++ 在g+中具有引用参数的构造函数+;编译程序,c++,C++,看看下面的代码 头文件: class CxUser { public: CxUser(string& guid) {} }; 我有一个C++文件,它使用 CxUser(String(“XXXXXX-XXXX”))< /COD>实例化类。但该语句无法在g++中编译,错误为“调用CxUser::CxUser(std::string)时没有匹配函数”,而它是在VC++中编译的。令人惊讶的是,下面的代码片段可以实例化该类 string guid("xxx-x-xxxx-xxx-xx

看看下面的代码

头文件:

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

我有一个C++文件,它使用<代码> CxUser(String(“XXXXXX-XXXX”))< /COD>实例化类。但该语句无法在g++中编译,错误为“调用CxUser::CxUser(std::string)时没有匹配函数”,而它是在VC++中编译的。令人惊讶的是,下面的代码片段可以实例化该类

string guid("xxx-x-xxxx-xxx-xx"); CxUser user(guid);
如果您需要任何帮助,我们将不胜感激。…

您需要:

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

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

从characterv数组创建临时字符串对象。在C++中,你不能将非const引用绑定到临时变量。

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


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

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

你能发布错误消息吗?如果是这样的话,你不能在一个临时文件上调用非常量成员(它接收一个指向非常量
this
),但是你可以。@Konrad:你是说你不能合法地在一个临时文件上调用非常量成员吗?你的意思是
常量std::string&
(当然,它在没有引用的情况下工作)是的。任何时候你传递一个非POD值,你都应该通过引用或指针来传递它。