// 1 filename:cpp2011-7-3-3.cpp // ver 0.1 June.13, 2014 // // 2 original examples and/or notes: // (c) ISO/IEC JTC1 SC22 WG21 N3242, April 12, 2011 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf // > 7 Declarations 7.3 Namespaces 7.3.3 The using declaration // // 3 compile and output mechanism: // (c) Dr. OGAWA Kiyoshi, kaizen at gifu-u.ac.jp, // // 4 compile errors and/or warnings: // 4.1(c) Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) // Target: x86_64-apple-darwin13.2.0, Thread model: posix // Command/Options: c++ -std=c++11 -stdlib=libc++ -Wall cpp2011-7-3-3.cpp // (c) LLVM 2003-2009 University of Illinois at Urbana-Champaign. // 4.2. g++-4.9 (GCC) 4.9.0 20131229 (experimental) // Copyright (C) 2013 Free Software Foundation, Inc. // This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // http://gcc.gnu.org/onlinedocs/gcc/Standards.html // Command/Options: g++-4.9 -std=c++11 -Wall cpp2011-7-3-3.cpp // g++-4.9: error: unrecognized command line option '-stdlib=libc++' // Configuration:brew install gcc49 // // 4.3. Visual Studio Express 2013, // (c) Microsoft http://www.visualstudio.com/ // SPEC: // Windows 7, .NET Framework // (c) VMware, Inc. // VMWare fusion 6 // // 5. Hardware: MacBook Pro, //(c) Intel http://ark.intel.com/products/37006/ //Core 2 Duo 2.53GHz, 8GB, 1067MHz DDR3 // // 6. Special Thanks: Upper organizatios and // ITSCJ/IPSJ http://www.itscj.ipsj.or.jp/itscj_english/index.html // Renesas Electronics Corporation.http://www.renesas.com/ // NPO SESSAME project, http://www.sessame.jp/workinggroup/WorkingGroup3/ // Toyo Corporation, http://www.toyo.co.jp/English/ // Japan Standard Association, http://bit.ly/1lzykg1 // NPO TOPPERS project, https://www.toppers.jp/asp-d-download.html // Daido Universcity, http://www.daido-it.ac.jp/gakubugakka/computer/index.html // WITZ Co.Ltd., http://www.witz-inc.co.jp/products/solution/solution.html // SevenWise.co., http://www.7ws.co.jp/index.html // TOYOTA Motor Corporation, http://toyota.jp/ // IT planning Inc., http://www.itpl.co.jp/en/index.html // DENSO Corporation, http://www.globaldenso.com/en/ // Aisin Seiki co. Ltd., http://www.aisin.com/ // Spancion Inc., http://www.spansion.com/ // Yazaki Corporation, http://www.yazaki-group.com/global/ // Pananosic Corporation, http://www.panasonic.net/ // SWEST: Summer Workshop on Embedded System Technologies , http://swest.toppers.jp // CEST: Consortium for Embedded System Technology, http://www.ertl.jp/CEST/ // JUSE: Union of Japanese Scientists and Engineers, http://www.juse.or.jp/e/ // OSC:Open Source Conference, http://www.ospn.jp/ #include //#include //#include //#include //#include //#include //#include //#include //#include using namespace std; struct B3 { void f(char); void g(char); enum E { e }; union { int x; }; }; struct D : B3 { using B3::f; void f(int) { f('c'); } // calls B::f(char) void g(int) { g('c'); } // recursively calls D::g(int) }; // class C1 { int g(); }; class D2 : public B3 { using B3::f; // OK: B is a base of D2 using B3::e; // OK: e is an enumerator of base B using B3::x; // OK: x is a union member of base B //error: using C::g; // error: C isn’t a base of D2 }; // struct A2 { template void f(T); template struct X { }; }; struct B1 : A2 { //error: using A::f; // ill-formed //error: using A::X; // ill-formed }; // struct X1 { int i; static int s; }; void f() { //error: using X::i; // error: X::i is a class member // and this is not a member declaration. //error: using X::s; // error: X::s is a class member // and this is not a member declaration. } // void f(); namespace A { void g(); } namespace X { using ::f; // global f using A::g; // A’s g } void h() { X::f(); // calls ::f X::g(); // calls A::g } // namespace A { int i; } namespace A1 { using A::i; using A::i; // OK: double declaration } void f1() { using A::i; using A::i; // error: double declaration } struct B2 { int i; }; struct X2 : B2 { using B2::i; //error: using B2::i; // error: double member declaration }; // namespace A { void f(int); } using A::f; // f is a synonym for A::f; // that is, for A::f(int). namespace A { void f(char); } void foo() { f('a'); // calls f(int), } // even though f(char) exists. void bar() { using A::f; // f is a synonym for A::f; // that is, for A::f(int) and A::f(char). f('a'); // calls f(char) } // namespace A { int x; } namespace B { int i; struct g { }; struct x { }; void f(int); void f(double); void g(char); // OK: hides struct g } void func() { int i; //error: using B::i; // error: i declared twice void f(char); using B::f; // OK: each f is a function f(3.5); // calls B::f(double) using B::g; g('a'); // calls B::g(char) struct g g1; // g1 has class type B::g using B::x; using A::x; // OK: hides struct B::x x = 99; // assigns to A::x struct x x1; // x1 has class type B::x } // namespace B { void f(int); void f(double); } namespace C { void f(int); void f(double); void f(char); } void h2() { using B::f; // B::f(int) and B::f(double) using C::f; // C::f(int), C::f(double), and C::f(char) f('h'); // calls C::f(char) //error: f(1); // error: ambiguous: B::f(int) or C::f(int)? //error: void f(int); // error: f(int) conflicts with C::f(int) and B::f(int) } // struct B6 { virtual void f(int); virtual void f(char); void g(int); void h(int); }; struct D6 : B6 { using B6::f; void f(int); // OK: D::f(int) overrides B::f(int); using B6::g; void g(char); // OK using B6::h; void h(int); // OK: D::h(int) hides B::h(int) }; void k(D6* p) { p->f(1); // calls D::f(int) p->f('a'); // calls B::f(char) p->g(1); // calls B::g(int) p->g('a'); // calls D::g(char) } // struct A5 { int x(); }; struct B5 : A5 { }; struct C5 : A5 { using A5::x; int x(int); }; struct D5 : B5, C5 { using C5::x; int x(double); }; int f(D5* d) { return d->x(); // ambiguous: B::x or C::x } // class A4 { private: void f(char); public: void f(int); protected: void g(); }; class B4 : public A4 { //error: using A4::f; // error: A::f(char) is inaccessible public: using A4::g; // B::g is a public synonym for A::g }; using namespace A; int main() { // cout << i << std::endl; cout << "7 Declarations 7.3 Namespaces 7.3.3 The using declaration" << std::endl; return 0; } // 1 error // 1.1 c++ -std=c++11 -stdlib=libc++ -Wall cpp2011-7-3-3.cpp cpp2011-7-3-3.cpp:184:10: error: target of using declaration conflicts with declaration already in scope using A::x; // OK: hides struct B::x ^ cpp2011-7-3-3.cpp:164:5: note: target of using declaration int x; ^ cpp2011-7-3-3.cpp:183:10: note: conflicting declaration using B::x; ^ cpp2011-7-3-3.cpp:185:3: error: expected unqualified-id x = 99; // assigns to A::x ^ cpp2011-7-3-3.cpp:239:8: error: ambiguous conversion from derived class 'D5' to base class 'A5': struct D5 -> struct B5 -> struct A5 struct D5 -> struct C5 -> struct A5 return d->x(); // ambiguous: B::x or C::x ^ > 3 errors generated. //1.2 gcc: g++-4.9 -std=c++11 -Wall cpp2011-7-3-3.cpp cpp2011-7-3-3.cpp: In function 'void f1()': cpp2011-7-3-3.cpp:136:10: error: 'i' is already declared in this scope using A::i; // error: double declaration ^ cpp2011-7-3-3.cpp:128:5: warning: unused variable 'A::i' [-Wunused-variable] int i; ^ cpp2011-7-3-3.cpp: In function 'void func()': cpp2011-7-3-3.cpp:175:5: warning: unused variable 'i' [-Wunused-variable] int i; ^ cpp2011-7-3-3.cpp:182:10: warning: unused variable 'g1' [-Wunused-variable] struct g g1; // g1 has class type B::g ^ cpp2011-7-3-3.cpp:186:10: warning: unused variable 'x1' [-Wunused-variable] struct x x1; // x1 has class type B::x ^ cpp2011-7-3-3.cpp: In function 'int f(D5*)': cpp2011-7-3-3.cpp:239:13: error: 'A5' is an ambiguous base of 'D5' return d->x(); // ambiguous: B::x or C::x ^