C ++中的关键字“using”可以用于除“namespace”之外的东西吗?

时间:2013-09-08 20:06:14

标签: c++

C ++中的关键字使用是否可以用于关键字命名空间之外的其他内容? 如果不是 - 为什么我们不能简单地写“名称空间...... ”?如果是 - 您可以在“非命名空间”上下文中提供一些使用示例吗?

感谢。

3 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:5)

是的,你可以using一个名字。例如

using std::swap;

仅对swap命名空间std进行“使用”,而

using namespace std;

在标准中提取每个名字。

答案 2 :(得分: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

相关问题