C++ 中的关键字“using”可以与“命名空间”以外的东西一起使用吗?

Posted

技术标签:

【中文标题】C++ 中的关键字“using”可以与“命名空间”以外的东西一起使用吗?【英文标题】:Can the keyword "using" in C++ be used with something except of "namespace"? 【发布时间】:2013-09-08 20:06:14 【问题描述】:

C++ 中的关键字 using 可以与关键字 namespace 以外的东西一起使用吗? 如果不是——那为什么我们不能简单地写“namespace ...”?如果是,请您举一些例子说明它在“非命名空间”上下文中的用法?

谢谢。

【问题讨论】:

***.com/questions/1896830/… 我已经回复你了,但是注意google search "using keyword C++"提供的第一个链接是cppreference.com关于它的参考页面。 【参考方案1】:

关键字using有多种不同的用途:

    您可以使用 using 指令声明命名空间中的所有名称都不需要命名空间前缀,例如,using namespace std。 您可以使用 using 声明声明命名空间的特定成员不需要命名空间前缀,例如 using std::vector。 您可以声明基类的成员函数不应隐藏在派生类中,例如,using B::f; 其中B 是基类,f 是此基类的可能重载成员。 您可以声明应继承基类的构造函数,例如,using B::B;。 您可以绑定模板参数并为模板命名或将其用于别名类型,例如template <typename T> using singleton = std::pair<int, T>;

【讨论】:

【参考方案2】:

是的,您可以using 一个名字。比如

using std::swap;

仅对命名空间std 中的swap 执行“使用”,而

using namespace std;

拉入标准中的每个名称。

【讨论】:

还将名称从派生类中的基类引入。 自 c++11 (using identifier = type_name;) 以来,type aliases 也代替了typedef 一个是“指令”,另一个是“声明”,非?【参考方案3】:

是的。它用于声明命名空间成员。例如:

namespace homebrew

   template<typename T>
   struct vector ;


int main()

    
        using namespace std;
        vector<T> v; //Refers to std::vector
    
    
        using homebrew::vector;
        vector<T> v; //Refers to homebrew::vector
    

也用于对类成员做同样的事情:

#include <iostream>
struct B 
    virtual void f(int)  std::cout << "B::f\n"; 
    void g(char)         std::cout << "B::g\n"; 
    void h(int)          std::cout << "B::h\n"; 
 protected:
    int m; // B::m is protected
    typedef int value_type;
;

struct D : B 
    using B::m; // D::m is public
    using B::value_type; // D::value_type is public

    using B::f;
    void f(int)  std::cout << "D::f\n";  // D::f(int) overrides B::f(int)
    using B::g;
    void g(int)  std::cout << "D::g\n";  // both g(int) and g(char) are visible
                                           // as members of D
    using B::h;
    void h(int)  std::cout << "D::h\n";  // D::h(int) hides B::h(int)
;

最后,它从 C++11 开始用于定义 type aliases,包括模板别名:

using vector_of_bool = std::vector<bool>;

template<typename T>
using vector_t = std::vector<T>;

示例摘自cppreference.com documentation about using keyword。

【讨论】:

以上是关于C++ 中的关键字“using”可以与“命名空间”以外的东西一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

喵呜:C++基础系列来啦来啦:namespace命名空间详解

C++ Primer 5th笔记(chap 18 大型程序工具) using指示

C++基础语法1

C++学习_C++概述

超详细的C++入门学习(命名空间,缺省参数,内联函数,函数重载等)

C++ Primer 5th笔记(chap 18 大型程序工具) 重载与命名空间