在C ++中,“ typedef”,“ using”,“ namespace”和“ using namespace”之间有什么区别?

时间:2018-09-29 06:19:30

标签: c++ namespaces header-files typedef using

我发现很难获得C ++中这些术语的确切含义。彼此之间似乎有很多重叠(至少是typedef和名称空间)。您能启发我为什么在C ++中发明这些概念吗?在什么情况下我们应该使用其中的每一种?

this的讨论也特别令人困惑。它说“ typedef”和“ using”是相同的。这让我想知道,如果两个术语几乎相同,为什么我们会有两个不同的术语?

由于对这些术语的理解不清,我编写了以下代码,并显示了以下错误:

Files.hpp

#include <boost/filesystem.hpp>
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>
#include <iostream>
#include <vector>
#include <string>
#include <utility>
#include <algorithm>
#include <fstream>
#include <ostream>
#include <iomanip>
#include <cmath>

class Files {

public:

//@Brief: We create some short forms for long type names
typedef boost::filesystem FS; //! Short form for boost filesystem
// Short form for file name pairs (for example, <200.jpg, 200>)
typedef std::pair<FS::path, int> file_entry;
// Short form for vector of tuples
typedef std::vector<file_entry> vec;
// Short form for iterator of type, boost::filesystem::directory_iterator
typedef FS::directory_iterator dirIter;
};

以下是我收到的 make 错误:

...../include/Files.hpp:10:20: error: ‘filesystem’ in namespace ‘boost’ does not name a type
 typedef boost::filesystem FS; //! Short form for boost filesystem

2 个答案:

答案 0 :(得分:2)

boost::filesystem是名称空间,而不是类型。因此,您可以这样做:

namespace FS = boost::filesystem;

答案 1 :(得分:2)

由于boost::filesystem不是类型而是namespace。在文件范围内使用名称空间别名:

namespace FS = boost::filesystem;