接続数

COUNTER378796FROM 2012/5/16

MISRA-C diary(C言語日誌)

MISRA-C >> Article details

2014/06/16

C++N3242, 2011(104) 10.2 Member name lookup

Tweet ThisSend to Facebook | by kaizen
// 1 filename:cpp2011-10-2.cpp
// ver 0.1 June.15, 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
// > 10 Derived classes 10.2 Member name lookup
//
// 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-10-2.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-10-2.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>
//#include <cstddef>
//#include <new>
//#include <vector>

using namespace std;

struct A { int x; }; // S(x,A) = { { A::x }, { A } }
struct B { float x; }; // S(x,B) = { { B::x }, { B } }
struct C: public A, public B { }; // S(x,C) = { invalid, { A in C, B in C } }
struct D: public virtual C { }; // S(x,D) = S(x,C)
struct E: public virtual C { char x; }; // S(x,E) = { { E::x }, { E } }
struct F: public D, public E { }; // S(x,F) = S(x,E)

//
struct A2 {
int f();
};
struct B2 {
int f();
};
struct C2 : A2, B2 {
int f() { return A2::f() + B2::f(); }
};
//
struct V {
int v;
};
struct A3 {
int a;
static int s;
enum { e };
};
struct B3 : A3, virtual V { };
struct C3 : A3, virtual V { };
struct D3 : B3, C3 { };
void f(D3* pd) {
pd->v++; // OK: only one v (virtual)
pd->s++; // OK: only one s (static)
int i = pd->e; // OK: only one e (enumerator)
//error: pd->a++; // error, ambiguous: two as in D
}
//
struct V2 { int f(); int x; };
struct W { int g(); int y; };
struct B4 : virtual V2, W {
int f(); int x;
int g(); int y;
};
struct C4 : virtual V2, W { };
struct D4 : B4, C4 { void glorp(); };
//
void D4::glorp() {
x++; // OK: B::x hides V::x
f(); // OK: B::f() hides V::f()
//error: y++; // error: B::y and C’s W::y
//error: g(); // error: B::g() and C’s W::g()
}
//

struct V5 { };
struct A5 { };
struct B5 : A5, virtual V5 { };
struct C5 : A5, virtual V5 { };
struct D5 : B5, C5 { };
void g() {
D5 d;
B5* pb = &d;
//error: A5* pa = &d; // error, ambiguous: C’s A or B’s A?
V5* pv = &d; // OK: only one V subobject
}
//
struct B1 {
void f();
static void f(int);
int i;
};
struct B6 {
void f(double);
};
struct I1: B1 { };
struct I2: B1 { };
struct D6: I1, I2, B6 {
using B1::f;
using B6::f;
void g() {
//error: f(); // Ambiguous conversion of this
f(0); // Unambiguous (static)
f(0.0); // Unambiguous (only one B2)
int B1::* mpB1 = &D6::i; // Unambiguous
//error: int D6::* mpD6 = &D6::i; // Ambiguous conversion
}
};
//
int main() {
F f;
f.x = 0; // OK, lookup finds E::x
cout << "10 Derived classes 10.2 Member name lookup" << std::endl;
return 0;
}
// 1 output
// 1.1 llvm: c++ -std=c++11 -stdlib=libc++  -Wall cpp2011-10-2.cpp 
cpp2011-10-2.cpp:106:5: warning: unused variable 'i' [-Wunused-variable]
int i = pd->e; // OK: only one e (enumerator)
    ^
cpp2011-10-2.cpp:134:5: warning: unused variable 'pb' [-Wunused-variable]
B5* pb = &d;
    ^
cpp2011-10-2.cpp:136:5: warning: unused variable 'pv' [-Wunused-variable]
V5* pv = &d; // OK: only one V subobject
    ^
cpp2011-10-2.cpp:156:23: error: non-static member 'i' found in multiple base-class subobjects of type 'B1':
    struct D6 -> struct I1 -> struct B1
    struct D6 -> struct I2 -> struct B1
int B1::* mpB1 = &D6::i; // Unambiguous
                  ~~~~^
cpp2011-10-2.cpp:142:5: note: member found by ambiguous name lookup
int i;
    ^
> 3 warnings and 1 error generated.
//1.2 gcc: g++-4.9 -std=c++11 -Wall cpp2011-10-2.cpp 
cpp2011-10-2.cpp: In function 'void f(D3*)':
cpp2011-10-2.cpp:106:5: warning: unused variable 'i' [-Wunused-variable]
 int i = pd->e; // OK: only one e (enumerator)
     ^
cpp2011-10-2.cpp: In function 'void g()':
cpp2011-10-2.cpp:134:5: warning: unused variable 'pb' [-Wunused-variable]
 B5* pb = &d;
     ^
cpp2011-10-2.cpp:136:5: warning: unused variable 'pv' [-Wunused-variable]
 V5* pv = &d; // OK: only one V subobject
     ^
cpp2011-10-2.cpp: In member function 'void D6::g()':
cpp2011-10-2.cpp:156:19: error: reference to 'i' is ambiguous
 int B1::* mpB1 = &D6::i; // Unambiguous
                   ^
cpp2011-10-2.cpp:142:5: note: candidates are: int B1::i
 int i;
     ^
cpp2011-10-2.cpp:142:5: note:                 int B1::i
cpp2011-10-2.cpp:156:11: warning: unused variable 'mpB1' [-Wunused-variable]
 int B1::* mpB1 = &D6::i; // Unambiguous
           ^
cpp2011-10-2.cpp: In function 'int main()':
cpp2011-10-2.cpp:163:3: error: request for member 'x' is ambiguous
 f.x = 0; // OK, lookup finds E::x
   ^
cpp2011-10-2.cpp:75:18: note: candidates are: float B::x
 struct B { float x; }; // S(x,B) = { { B::x }, { B } }
                  ^
cpp2011-10-2.cpp:74:16: note:                 int A::x
 struct A { int x; }; // S(x,A) = { { A::x }, { A } }
                ^


11:59 | Impressed! | Voted(0) | Comment(0)