【问题标题】:C++ Using a symbol from a namespaceC++ 使用命名空间中的符号
【发布时间】:2014-03-14 06:40:55
【问题描述】:

我正在学习 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?这对我来说更有意义。

【问题讨论】:

    标签: c++ namespaces


    【解决方案1】:

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

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

    【讨论】:

    • 酷,谢谢。我同意这个推理。 (这只是让我更难找到声明,虽然现在我知道了,我会知道下次要找什么)
    【解决方案2】:

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

    也就是说,一位用户发现了语法上的细微差别,参见。 Konstantin Oznobihin 在What are the differences between typedef and using? 中的回答(你不能使用带有 typedef 名称的“Elaborated type specifier”,但你可以使用使用声明引入的名称)。参照。平价标准草案的7.1.6.3。

    【讨论】:

    • 就像我在问题中所说的那样,我尝试用 typedef 替换该行,并且似乎代码也可以编译。所以和这里使用的效果是一样的。
    • 你说得对,我完全重写了我的答案。 “详细类型说明符”是声明 struct vars 的 C 方式,例如“struct T t;”。这在 C++ 中通常不是必需的,因为类名本身已经是类型名,但它仍然是可能的(删除它会破坏移植的 C 代码)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 2011-03-13
    • 2014-07-17
    • 1970-01-01
    • 2011-05-10
    • 2011-02-01
    • 2019-08-03
    相关资源
    最近更新 更多