在 Qt 4 中,可以自动将 QString 转换为“const char *”,例如我可以将 QString 传递给需要“const char *”的函数。
void myFunction(const char *parameter);
QString myString;
myFunction(myString); //works in QT4
然而,在 Qt 5 中,我会收到“错误 C2440:‘type cast’:无法从‘QString’转换为‘const char *’”(这是 Visual C++ 2008 编译器,其他编译器会抛出类似的东西)。如果我对文档的理解正确,那是因为 QT5 中不再包含 Qt 3 兼容层。
当然,我可以更改函数调用
myFunction(myString);
到
myFunction(myString.toLatin1().data());
但是,我有一个巨大的代码库,可以很好地使用 Qt 4 进行编译,我真的很想用 Qt 5 编译我的旧代码而不修改它。有什么办法可以实现吗?
最佳答案
您可以根据自己的目的创建一个宏或内联函数,以尽量减少更改,但由于这也需要类似 grep 的操作,因此没有太大区别。
#define QString2charp(myString) myString.toLatin1().data()
或
inline char* QString2charp (const QString &myString)
{
return myString.toLatin1().data();
}
然后:
myFunction(QString2charp(myString));
但是
当然,在一个理想的世界中,如果您的“myFunction”能够获得一个期望 QString
参数的重载,那就太好了。
void myFunction(const char *parameter);
void myFunction(QString parameter);
然后重载将像这样实现:
void myFunction(const QString ¶meter)
{
myFunction(myString.toLatin1().data());
}
当然,这将要求构造函数是显式的,这样就不会发生隐式转换,否则编译器会在尝试传递 const char*
时提示两者都存在歧义,但是如果您始终使用 QString,它应该只适用于 Qt 5。
这有点等同于将原始函数重写为期望 QString
的不同签名,尽管不幸的是相应的构造函数不是显式的。我想这在 Qt 5 中并没有因为兼容性而改变,因为它会破坏太多代码。
如您所见,除了添加单行代码重载外,您无需以这种方式更改代码中的任何内容。很整洁,不是吗?
关于c++ - Qt 5 : const char * QString cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23675479/