7、using声明 和 using指示
  使用using声明 和 using指示 的好处是可以使用使用名字空间中成员时,不必加上名字空间的作用域。
  using std::cout; //using声明
  using namespace std; //using指示
  7.1、using声明(using declaration)
  一个 using 声明一次只引入一个命名空间成员。
  using 声明的作用域从 using 声明点开始,直到包含 using 声明的作用域的末尾,名字都是可见的。外部作用域中定义的同名实体被屏蔽。
  using 声明可以出现在全局、局部、类的作用域 和 名字空间中。在类作用域中using声明只能引用基类成员。
//using declaration in Global Scope
#include <iostream>
using std::cout;              //using声明
using std::endl;              //using声明
int main(void)
{
cout<<"Hello World"<<endl;
return 0;
}
//using declaration in Local Scope
#include <iostream>
void func(void)
{
using std::cout;
using std::endl;
cout << "Using Declarations In Function"<<endl;
}
int main()
{
func();
//  cout << "Hello" <<endl; //error: ‘cout’ and ‘endl’ were not declared in this scope
return 0;
}
//using declaration in Class Scope
#include <stdio.h>
class B
{
public:
void f(void) {printf("In B::f() ");}
void g(void) {printf("In B::g() ");}
};
class C
{
public:
void g() {printf("In C::g() ");};
};
class D : public B
{
public:
using B::f;      // OK: B is a base of D2
using B::g;      // OK: B is a base of D2
// using C::g;      // error: C isn't a base of D2
};
int main(void)
{
D MyD;
MyD.f();
MyD.g();
}
//using declaration in Namespce
#include <iostream>
namespace MyNames
{
using std::string;
using std::cout;
using std::endl;
string str;
void func(void){cout << "Hello"<<endl;}
}
int main(void)
{
MyNames::func();
return 0;
}
  7.2、using指示(using directive)
  using 指示使得整个名字空间中的成员都可见。
  using 指示可以出现在全局、局部的作用域 和 名字空间中,不会出现在类的作用域中。
//using directive in Global Scope
#include <iostream>
using namespace std;            //using指示
int main(void)
{
cout<<"Hello World"<<endl;
return 0;
}
//using directive in Local Scope
#include <iostream>
void func(void)
{
using namespace std;
cout << "Using Declarations In Function"<<endl;
}
int main()
{
func();
//  cout << "Hello" <<endl; //error: ‘cout’ and ‘endl’ were not declared in this scope
return 0;
}
//using declaration in Namespce
#include <iostream>
namespace MyNames
{
using namespace std;
string str;
void func(void){cout << "Hello"<<endl;}
}
int main(void)
{
MyNames::func();
//    cout<<"Hello"<<endl; //error: ‘cout’ and ‘endl’ were not declared in this scope
return 0;
}
  7.3、避免使用using指示
  using 指示注入来自一个命名空间的所有名字,这个方法看似简单,但是如果应用程序使用许多库,并且用 using 指示使得这些库中的名字可见,那么,全局命名空间污染问题重新出现。
  相对于依赖于 using 指示,对程序中使用的每个命名空间名字使用using 声明更好,这样做减少注入到命名空间中的名字数目,由 using 声明引起的二义性错误容易发现和修正。
  8、综合应用举例
////file : mynames.hpp
#ifndef MYNAMES__HPP_
#define MYNAMES__HPP_
namespace MyNames
{
//Member:Variable
extern int iVal;
//Member:Class
class MyString
{
public:
MyString(const std::string&);
void OutputString(void);
private:
std::string str;
};
//Member:Function
void NormalFunc(void);
//Member:Struct
struct st_Names
{
char ch;
int count;
};
//Member:Union
union un_Names
{
char ch;
int count;
};
//Member:enum
enum en_Names
{
ZERO,
ONE,
TWO
};
}
#endif /* MYNAMES__HPP_ */
//------------------------------------------------------------------------------------------------------------
//file : mynames.cpp
#include <iostream>
#include "mynames.hpp"
namespace MyNames
{
int iVal = 100;
MyString::MyString(const std::string& refstr)
{
str = refstr;
}
void MyString::OutputString(void)
{
std::cout << str << std::endl;
}
void NormalFunc(void)
{
std::cout << "NormalFunc" << std::endl;
}
}
//-------------------------------------------------------------------------------------------------------------
//file : example.cpp
#include <iostream>
#include "mynames.hpp"
namespace Name = MyNames;
using namespace Name;
int main(void)
{
std::cout<<iVal<<std::endl;
std::cout<<Name::iVal<<std::endl;
std::cout<<MyNames::iVal<<std::endl;
MyNames::MyString mystr("Hello");
mystr.OutputString();
MyNames::NormalFunc();
MyNames::st_Names myst;
myst.count = 0;
MyNames::en_Names myen;
myen = MyNames::ZERO;
MyNames::un_Names myun;
myun.count = 1;
return 0;
}