在Qt程序中使用C++标准库输出流可能遇到的问题
时间:2010-03-28 来源:tyc611
今天在写代码时,遇到了一个奇怪的问题。分析发现,此类似问题很容易引起难以发现的Bug,特分享于大家。
问题代码简化如下:
typedef std::wostream OStreamType;
#include <QtCore/QtCore>
...
OStreamType os;
...
os << endl; // (1)
...
在上面的代码中,(1)处的代码并不会按预期调用std::endl(os),而是调用了std::wostream::operator<<(const void *)函数,此时函数参数为<QtCore/QTextStream>中的endl。如果把(1)处的代码改为“os << std::endl”,那么其结果将是我们所期望的。
因此,在Qt程序中使用标准C++库中的输出流时需要注意这个问题,其可能会导致难以察觉的Bug。
此外,这个问题同样存在于<QtCore/QTextStream/QTextStream>中定义的其它类似IO Manipulator,比如hex,fixed等等。
避免方法:在使用了标准库的源文件中加上using namespace std指令,或者使用限制名(如std::endl)。
问题代码简化如下:
typedef std::wostream OStreamType;
#include <QtCore/QtCore>
...
OStreamType os;
...
os << endl; // (1)
...
在上面的代码中,(1)处的代码并不会按预期调用std::endl(os),而是调用了std::wostream::operator<<(const void *)函数,此时函数参数为<QtCore/QTextStream>中的endl。如果把(1)处的代码改为“os << std::endl”,那么其结果将是我们所期望的。
因此,在Qt程序中使用标准C++库中的输出流时需要注意这个问题,其可能会导致难以察觉的Bug。
此外,这个问题同样存在于<QtCore/QTextStream/QTextStream>中定义的其它类似IO Manipulator,比如hex,fixed等等。
避免方法:在使用了标准库的源文件中加上using namespace std指令,或者使用限制名(如std::endl)。
相关阅读 更多 +