接続数

COUNTER379455FROM 2012/5/16

MISRA-C diary(C言語日誌)

MISRA-C >> Article details

2014/06/15

C++N3242, 2011 (64) 7.3.3 The using declaration

Tweet ThisSend to Facebook | by kaizen
// 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 <iostream>
//#include <cstdlib>
//#include <string.h>
//#include <cstring>
//#include <type_traits>
//#include <cassert>
//#include <algorithm>
//#include <cmath>
//#include <complex>

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 <class T> void f(T);
template <class T> struct X { };
};
struct B1 : A2 {
//error: using A::f<double>; // ill-formed
//error: using A::X<int>; // 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
             ^

07:01 | Impressed! | Voted(0) | Comment(0)