【问题标题】:What are the differences between "typedef", "using", "namespace" and "using namespace" in C++?C++中的“typedef”、“using”、“namespace”和“using namespace”有什么区别?
【发布时间】:2018-09-29 06:19:29
【问题描述】:

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

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

由于对这些术语的理解不佳,我编写了以下代码并得到如下所示的错误:

文件.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

【问题讨论】:

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


    【解决方案1】:

    boost::filesystem 是命名空间,而不是类型。所以你可以这样做:

    namespace FS = boost::filesystem;
    

    【讨论】:

    • 如果我错了,请原谅我。但是这个(stackoverflow.com/questions/10747810/…)是我提到的讨论。它说 typedef 和命名空间是相同的。现在我很困惑。
    • 它们不是等价的。您可以使用using 代替typedef,但反之则不行。
    • Typedef 和命名空间肯定是不一样的。您链接的那个问题与命名空间无关(它甚至不包含“命名空间”这个词)。
    【解决方案2】:

    因为boost::filesystem 不是类型而是namespace。在文件范围内使用命名空间别名:

    namespace FS = boost::filesystem;
    

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 2012-05-31
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      相关资源
      最近更新 更多