g++ 似乎无法推断数据类型,除非在单独的行上声明(与 Visual C++ 不同)?
g++ can't seem to infer datatype unless declared on a separate line (unlike Visual C++)?
我遇到了一些问题,因为我在Windows上使用Visual C++进行开发,然后也使用g++在Linux上进行编译。我遇到了一件我不理解的事情,那就是如果将对构造函数的引用传递给函数,g++似乎无法匹配传递给函数的数据类型。具体来说,给定这样的方法签名:
static int to_int(string& value);
如果这样称呼:
int id_number = EZXMsg::to_int(string(tokens[index]));
(其中令牌类型为vector<char*>& tokens
)
g++给出错误:
main.cpp:130:错误:没有用于调用的匹配函数'ezx::iserver::EZXMsg::to_int(std::string)'../iserver-api/ezxmsg.h:50:注意:候选为:static intezx::iserver::EZXMsg::to_int(std::string&)
不过,Visual C++编译此代码没有问题。要修复g++,代码需要如下所示:
string value(tokens[index]);
int roid = EZXMsg::to_int(value);
g++需要额外一行的原因是什么?
您正试图将一个临时引用绑定到一个非常量引用。这在标准C++中是不允许的。
static int to_int(string& value);
// ^^^^^^^ non-const reference
int id_number = EZXMsg::to_int(string(tokens[index]));
// ^^^^^^^^^^^^^^^^^^^^^^ temporary string: no no!
最有可能的解决方案是通过const
引用:
static int to_int(const string& value);
// ^^^^^ const reference: yes yes!
如果你真的需要在函数内部更改字符串(to_int
函数不太可能需要),你必须将一个非临时字符串传递给一个使用非常量引用的函数:
auto s = string(tokens[index]);
int id_number = EZXMsg::to_int(s); // OK, s is not a temporary
相关文章:
- Visual Studio中的函数声明和函数定义问题
- visual MSVC cl.exe尝试使用C++标头范例(定义与声明)
- C++模块(MSVC)中的visual Forward声明
- 如何在Visual Studio C++中声明一个二维字符串数组?
- 如何在 OPENCV 3.x C++ Visual Studio 2015 中声明 BruteForceMatcher
- Visual Studio C++不接受>>或<<超过初始声明
- 在Visual C++中,未声明的变量未标记为错误
- 如何使用Visual Studio轻松缩进标头声明
- 如何在Visual Studio/C++/.NET中快速查找给定声明所需的头文件
- Visual Studio中的C++成员函数声明
- 声明数组(visual c++)
- Visual Studio 10:在我的Windows 10上未声明Saxxmlreader
- 返回前向声明的枚举类是否有效?(Visual Studio 2015 链接器错误)
- 在某些情况下,Visual Studio 看不到函数声明
- 我可以在Visual Studio 2012中将方法声明为朋友吗?
- Visual Studio C++ 字符串比较而不带声明
- Visual Studio 2010 链接器错误C++声明我从头文件创建的类时
- Visual Studio,错误:在数组声明中使用 #define 常量时,应使用"]"
- g++ 似乎无法推断数据类型,除非在单独的行上声明(与 Visual C++ 不同)?
- Visual C++ 2013 和错误 C2065:"复杂":未声明的标识符和错误 C2059:语法错误:","