2015-02-08 100 views
1

在阅读“C++ gui programming eith Qt 4,第二版”时,我遇到了这个主题: “STL头文件提供了一套更完整的通用算法,这些算法可用于Qt容器和STL容器。 STL实现在所有平台上都可用,当Qt缺少等价算法时,可能没有理由避免使用STL算法。“如何在Qt中使用STL算法?

它声明STL(在“算法”头文件中定义)的通用算法也可以用于Qt容器。但是,当我运行下面的代码它显示了一个错误,“排序:标识符找不到”:

#include <QApplication> 
#include <algorithm> 
#include <QVector> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
QVector<int>vec{9,6,10,5,7}; 
sort(vec.begin(),vec.end()); 
    return a.exec(); 
} 

有什么办法解决它,而无需使用Qt的算法?

+0

CONFIG + = stl in .pro应该解决这个问题。 – rptr87 2015-02-08 06:12:00

+0

@Puttaraju仍然无法正常工作。 – 2015-02-08 06:19:40

回答

2

此功能定位在std名字空间,所以只写:

#include <QApplication> 
#include <algorithm> 
#include <QVector> 
using namespace std;//new line! 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
QVector<int>vec{9,6,10,5,7}; 
sort(vec.begin(),vec.end()); 
    return a.exec(); 
} 

或者每次写std::sort

#include <QApplication> 
#include <algorithm> 
#include <QVector> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
QVector<int>vec{9,6,10,5,7}; 
std::sort(vec.begin(),vec.end()); 
    return a.exec(); 
} 
+0

永远不要建议任何人使用“使用命名空间”。 – 2015-02-08 08:31:41

+0

@DiegoSánchez也许你能告诉更多?为什么?只是因为未来的OP会在另一个命名空间中编写另一个排序函数,会为每个命名空间写'使用命名空间'并且会导致编译器错误? – Chernobyl 2015-02-08 08:43:13

+0

以上警告主要适用于头文件。在源文件中使用'namespace'通常是安全的。 – RobbieE 2015-02-08 08:43:22

3

要在@扩大切尔诺贝利的答案:C++库将所有标准容器,算法等存储到命名空间std中。这意味着使用它们,你必须要么把他们带入全局命名空间(using namespace std;using std::sort)或只是证明你自己std::sort(vec.begin(), vec.end());

无论是一个正常工作的名称。 原因在于否则标准库中的所有标识符都将实际上变成“保留字”,并且您将无法(轻易地)在您的程序中将它们用于您自己的使用。例如,没有理由不能自己编写一个名为sort的函数,它会对特定的数据结构进行排序。然后sort(..)会调用你的例程,而std::sort(..)会调用标准库中的那个。同上find,erase,remove,string, list等等。