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指示