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值,你都应该通过引用或指针来传递它。