我遇到了一些问题,因为我在Windows上使用Visual C++进行开发,然后使用g ++在Linux上进行编译.我遇到的一件事我不明白,如果你将对构造函数的引用传递给函数,g ++似乎无法匹配传递给函数的数据类型.具体来说,给定一个像这样的方法签名:
static int to_int(string& value);
Run Code Online (Sandbox Code Playgroud)
如果它被调用如下:
int id_number = EZXMsg::to_int(string(tokens[index]));
Run Code Online (Sandbox Code Playgroud)
(令牌类型是a vector<char*>& tokens)
g ++给出错误:
main.cpp:130:错误:没有匹配函数调用'ezx :: iserver :: EZXMsg :: to_int(std :: string)'../iserver-api/ezxmsg.h:50:注意:候选人是: static int ezx :: iserver :: EZXMsg :: to_int(std :: string&)
虽然Visual C++没有编译问题.要为g ++修复它,代码需要像这样:
string value(tokens[index]);
int roid = EZXMsg::to_int(value);
Run Code Online (Sandbox Code Playgroud)
g ++需要额外线路的原因是什么?
您正在尝试将临时绑定到非const引用.这在标准C++中是不允许的.
static int to_int(string& value);
// ^^^^^^^ non-const reference
int id_number = EZXMsg::to_int(string(tokens[index]));
// ^^^^^^^^^^^^^^^^^^^^^^ temporary string: no no!
Run Code Online (Sandbox Code Playgroud)
最可能的解决方案是传递const参考:
static int to_int(const string& value);
// ^^^^^ const reference: yes yes!
Run Code Online (Sandbox Code Playgroud)
如果你真的需要改变函数内部的字符串(to_int函数不太可能需要),你必须将一个非临时字符串传递给一个非const引用的函数:
auto s = string(tokens[index]);
int id_number = EZXMsg::to_int(s); // OK, s is not a temporary
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |