C ++使用命名空间中的符号

时间:2014-03-14 06:40:56

标签: c++ namespaces

我正在学习websocketpp仅限标头的库如何工作,而且我对于遍布各处的lib::error_code类型感到非常困惑。 Xcode只会告诉我类型的声明在<system_error>标题中,这有点令人困惑,因为我看到lib是一个websocketpp命名空间。

然后我最终在websocketpp/common/system_error.hpp中找到了这个:

namespace websocketpp {
namespace lib {

#ifdef _WEBSOCKETPP_CPP11_SYSTEM_ERROR_
    using std::error_code;

这是命名空间内的using,这不是我理解的内容。

这是做什么的?这只是将websocketpp::lib::error_code简称为std::error_code吗?

如果是这样,为什么这不被称为typedef std::error_code error_code?这对我来说更有意义。

2 个答案:

答案 0 :(得分:1)

两者几乎完全相同,参见What is the difference between 'typedef' and 'using' in C++11?带有相关标准报价。

也就是说,一位用户发现了有关语法的细微差别,参见Konstantin Oznobihin的答案在What are the differences between typedef and using?中(你不能使用&#34; Elaborated类型说明符&#34;使用typedef名称,但你可以使用带有using声明的名称)。参看比肩。标准草案的7.1.6.3。

答案 1 :(得分:1)

(此处为WebSocket ++库作者)using允许将模板类别名化为C ++ 98中的命名空间。 typedef(pre-c ++ 11)需要完全指定的类型。

对于lib::error_code,这是无关紧要的,因为它不是模板类,而是命名空间websocketpp::lib用于boost::std::之间别名的一般模式要求它也适用于模板类(例如lib::shared_ptr)。为了保持一致性,websocketpp::lib中的所有别名都使用using语法,而不是在非模板类的typedef和模板的using之间切换。