use*_*262 5 c++ qstring qt4 qt5 qtcore
在Qt 4中,可以自动将QString转换为"const char*",例如,我可以将QString传递给期望"const char*"的函数.
void myFunction(const char *parameter);
QString myString;
myFunction(myString); //works in QT4
Run Code Online (Sandbox Code Playgroud)
在Qt 5中,我会得到一个"错误C2440:'type cast':无法从'QString'转换为'const char*'"(即Visual C++ 2008编译器,其他编译器会抛出类似的东西).如果我正确理解文档,那是因为QT5中不再包含Qt 3兼容层.
当然,我可以改变函数调用
myFunction(myString);
Run Code Online (Sandbox Code Playgroud)
至
myFunction(myString.toLatin1().data());
Run Code Online (Sandbox Code Playgroud)
但是,我有一个庞大的代码库,可以用Qt 4编译好,我真的想让我的旧代码用Qt 5编译而不修改它.有没有办法实现这个目标?
您可以根据自己的目的创建一个宏或内联函数来最小化更改,但由于这也需要类似 grep 的操作,因此没有太大区别。
#define QString2charp(myString) myString.toLatin1().data()
Run Code Online (Sandbox Code Playgroud)
或者
inline char* QString2charp (const QString &myString)
{
return myString.toLatin1().data();
}
Run Code Online (Sandbox Code Playgroud)
进而:
myFunction(QString2charp(myString));
Run Code Online (Sandbox Code Playgroud)
当然,在理想的世界中,如果您的“myFunction”能够在等待参数时发生过载,那就太好了QString
。
void myFunction(const char *parameter);
void myFunction(QString parameter);
Run Code Online (Sandbox Code Playgroud)
然后重载将像这样实现:
void myFunction(const QString ¶meter)
{
myFunction(myString.toLatin1().data());
}
Run Code Online (Sandbox Code Playgroud)
当然,这需要显式构造函数,以便不会发生隐式转换,否则编译器在尝试传递时会抱怨两者存在歧义const char*
,但如果您始终使用 QString,则它应该仅适用于 Qt 5。
这在某种程度上等于将原始函数重写为不同的签名QString
,因为不幸的是相应的构造函数不是显式的。我想 Qt 5 中并没有为了兼容性而改变这一点,因为它会破坏太多代码。
正如您所看到的,除了添加单行重载之外,您不需要以这种方式更改代码中的任何内容。很整洁,不是吗?