#include <iostream>
#include <string>
using namespace std;
namespace ns1
{
enum E
{
e1, e2
} ;
void printVal( E e )
{
switch ( e)
{
case e1: cout << "E: e1\n " ; break ;
case e2: cout << "E: e2\n " ; break ;
} ;
}
void printVal( int val)
{
cout << "int: " << val<< "\n " ;
}
void printVal( unsigned val)
{
cout << "unsigned: " << val<< "\n " ;
}
void printVal( const char * s )
{
cout << "const char*: " << s<< "\n " ;
}
void printVal( std:: string s )
{
cout << "std::string: " << s<< "\n " ;
}
template < typename T >
void printTpl( const T & t)
{
cout << "Tpl: " << t<< "\n " ;
}
template <>
void printTpl< unsigned > ( const unsigned & t)
{
cout << "Tpl<unsigned>: " << t<< "\n " ;
}
} // namespace ns1
namespace ns2
{
using ns1:: printVal ;
using ns1:: printTpl ;
using ns1:: E ;
}
int main( ) {
ns2:: E e = ns2:: e1 ;
int i = 8 ;
unsigned u = 10 ;
std:: string s = "sss" ;
const char * str = "str" ;
ns2:: printVal ( e) ;
ns2:: printVal ( i) ;
ns2:: printVal ( u) ;
ns2:: printVal ( s) ;
ns2:: printVal ( str) ;
cout << "---\n " ;
ns2:: printTpl ( i) ;
ns2:: printTpl ( u) ;
ns2:: printTpl ( s) ;
ns2:: printTpl ( str) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCm5hbWVzcGFjZSBuczEKewoKICAgIGVudW0gRQogICAgewogICAgCWUxLCBlMgogICAgfTsKICAgIAoJdm9pZCBwcmludFZhbCggRSBlICkKCXsKCQlzd2l0Y2goZSkKCQl7CgkJCWNhc2UgZTE6IGNvdXQ8PCJFOiBlMVxuIjsgYnJlYWs7CgkJCWNhc2UgZTI6IGNvdXQ8PCJFOiBlMlxuIjsgYnJlYWs7CgkJfTsKCX0KCQoJdm9pZCBwcmludFZhbCggaW50IHZhbCkKCXsKCQljb3V0PDwiaW50OiAiPDx2YWw8PCJcbiI7Cgl9CgkKCXZvaWQgcHJpbnRWYWwoIHVuc2lnbmVkIHZhbCkKCXsKCQljb3V0PDwidW5zaWduZWQ6ICI8PHZhbDw8IlxuIjsKCX0KCQoJdm9pZCBwcmludFZhbCggY29uc3QgY2hhciogcyApCgl7CgkJY291dDw8ImNvbnN0IGNoYXIqOiAiPDxzPDwiXG4iOwoJfQoJCgl2b2lkIHByaW50VmFsKCBzdGQ6OnN0cmluZyBzICkKCXsKCQljb3V0PDwic3RkOjpzdHJpbmc6ICI8PHM8PCJcbiI7Cgl9CgkKCXRlbXBsYXRlPCB0eXBlbmFtZSBUID4KCXZvaWQgcHJpbnRUcGwoIGNvbnN0IFQgJnQpCgl7CgkJY291dDw8IlRwbDogIjw8dDw8IlxuIjsKCX0KCQoJdGVtcGxhdGU8PgoJdm9pZCBwcmludFRwbDx1bnNpZ25lZD4oIGNvbnN0IHVuc2lnbmVkICZ0KQoJewoJCWNvdXQ8PCJUcGw8dW5zaWduZWQ+OiAiPDx0PDwiXG4iOwoJfQoJCn0gLy8gbmFtZXNwYWNlIG5zMQoKbmFtZXNwYWNlIG5zMgp7Cgl1c2luZyBuczE6OnByaW50VmFsOwoJdXNpbmcgbnMxOjpwcmludFRwbDsKCXVzaW5nIG5zMTo6RTsKCn0KCgppbnQgbWFpbigpIHsKCQoJbnMyOjpFIGUgPSBuczI6OmUxOwoJaW50ICAgICAgICAgIGkgPSA4OwoJdW5zaWduZWQgICAgIHUgPSAxMDsKCXN0ZDo6c3RyaW5nICBzID0gInNzcyI7Cgljb25zdCBjaGFyICogc3RyID0gInN0ciI7CgkKCW5zMjo6cHJpbnRWYWwoZSk7CgluczI6OnByaW50VmFsKGkpOwoJbnMyOjpwcmludFZhbCh1KTsKCW5zMjo6cHJpbnRWYWwocyk7CgluczI6OnByaW50VmFsKHN0cik7Cgljb3V0PDwiLS0tXG4iOwoJbnMyOjpwcmludFRwbChpKTsKCW5zMjo6cHJpbnRUcGwodSk7CgluczI6OnByaW50VHBsKHMpOwoJbnMyOjpwcmludFRwbChzdHIpOwp9