gpt4 book ai didi

c++ - Qt 5 : const char * QString cast

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:15 30 4
gpt4 key购买 nike

在 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 &parameter)
{
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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com