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

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

谢谢。

【问题讨论】:

标签: c++


【解决方案1】:

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

  1. 您可以使用 using 指令声明命名空间中的所有名称都不需要命名空间前缀,例如,using namespace std
  2. 您可以使用 using 声明声明命名空间的特定成员不需要命名空间前缀,例如 using std::vector
  3. 您可以声明基类的成员函数不应隐藏在派生类中,例如,using B::f; 其中B 是基类,f 是此基类的可能重载成员。
  4. 您可以声明应继承基类的构造函数,例如,using B::B;
  5. 您可以绑定模板参数并为模板命名或将其用于别名类型,例如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

    【讨论】:

      猜你喜欢
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 2011-10-05
      相关资源
      最近更新 更多