6.5.2 Member name lookup [class.member.lookup] C++N4910:2022 (13) p44.cpp
There are many compile errors.
算譜(source code)
p44.cpp
// C++N4910 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/n4910.pdf
const char * msg="6.5.2 Member name lookup [class.member.lookup] C++N4910:2022 (13) p44.cpp";
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
//[Example 1 :
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)
int main() {
F f;
f.x = 0; // OK, lookup finds E::x
}
// Example 2 :
struct V {
int v;
};
struct A {
int a;
static int s;
enum { e };
};
struct B : A, virtual V { };
struct C : A, virtual V { };
struct D : B, C { };
void f(D* pd) {
pd->v++; // OK, only one v (virtual)
pd->s++; // OK, only one s (static)
int i = pd->e; // OK, only one e (enumerator)
pd->a++; // error: ambiguous: two as in D
}
// [Example 3 :
void D::glorp() {
x++; // OK, B::x hides V::x
f(); // OK, B::f() hides V::f()
y++; // error: B::y and C’s W::y
g(); // error: B::g() and C’s W::g()
}
struct V { int f(); int x; };
struct W { int g(); int y; };
struct B : virtual V, W {
int f(); int x;
int g(); int y;
};
struct C : virtual V, W { };
struct D : B, C { void glorp(); };
// [Example 4 :
struct V { };
struct A { };
struct B : A, virtual V { };
struct C : A, virtual V { };
struct D : B, C { };
void g() {
D d;
B* pb = &d;
A* pa = &d; // error: ambiguous: C’s A or B’s A?
V* pv = &d; // OK, only one V subobject
}
// [Example 5 :
struct B1 {
void f();
static void f(int);
int i;
};
struct B2 {
void f(double);
};
struct I1: B1 { };
struct I2: B1 { };
struct D: I1, I2, B2 {
using B1::f;
using B2::f;
void g() {
f(); // Ambiguous conversion of this
f(0); // Unambiguous (static)
f(0.0); // Unambiguous (only one B2)
int B1::* mpB1 = &D::i; // Unambiguous
int D::* mpD = &D::i; // Ambiguous conversion
}
};
int main() { return sq(9);// OK, sq from module
cout<< msg << endl;
return EXIT_SUCCESS;
}
Script
clgc.sh
#!/bin/sh
rm $1l
rm $1g
echo "$ clang++ $1.cpp -std=03 -o $1l -I. -Wall"
clang++ $1.cpp -std=c++03 -o $1l -I. -Wall
if [ -e $1l ]; then
./$1l
fi
rm $1l
echo "$ clang++ $1.cpp -std=2b -o $1l -I. -Wall"
clang++ $1.cpp -std=c++2b -o $1l -I. -Wall
if [ -e $1l ]; then
./$1l
fi
echo "\r"
echo "$ g++ $1.cpp -std=03 -o $1g -I. -Wall"
g++ $1.cpp -std=c++03 -o $1g -I. -Wall
if [ -e $1g ]; then
./$1g
fi
rm $1g
echo "\r"
echo "$ g++ $1.cpp -std=2b -o $1g -I. -Wall"
g++ $1.cpp -std=c++2b -o $1g -I. -Wall
if [ -e $1g ]; then
./$1g
fi
編纂・実行結果(compile and go)
clgc.sh
# ./clgc.sh p44
rm: cannot remove 'p44l': No such file or directory
rm: cannot remove 'p44g': No such file or directory
$ clang++ p44.cpp -std=03 -o p44l -I. -Wall
p44.cpp:27:8: error: redefinition of 'A'
struct A {
^
p44.cpp:13:8: note: previous definition is here
struct A { int x; }; // S(x,A) = { { A::x }, { A } }
^
p44.cpp:32:8: error: redefinition of 'B'
struct B : A, virtual V { };
^
p44.cpp:14:8: note: previous definition is here
struct B { float x; }; // S(x,B) = { { B::x }, { B } }
^
p44.cpp:33:8: error: redefinition of 'C'
struct C : A, virtual V { };
^
p44.cpp:15:8: note: previous definition is here
struct C: public A, public B { }; // S(x,C) = { invalid, { A in C, B in C } }
^
p44.cpp:34:8: error: redefinition of 'D'
struct D : B, C { };
^
p44.cpp:16:8: note: previous definition is here
struct D: public virtual C { }; // S(x,D) = S(x,C)
^
p44.cpp:36:5: error: no member named 'v' in 'D'
pd->v++; // OK, only one v (virtual)
~~ ^
p44.cpp:37:5: error: no member named 's' in 'D'
pd->s++; // OK, only one s (static)
~~ ^
p44.cpp:38:13: error: no member named 'e' in 'D'
int i = pd->e; // OK, only one e (enumerator)
~~ ^
p44.cpp:39:5: error: no member named 'a' in 'D'
pd->a++; // error: ambiguous: two as in D
~~ ^
p44.cpp:42:9: error: out-of-line definition of 'glorp' does not match any declaration in 'D'
void D::glorp() {
^~~~~
p44.cpp:43:1: error: member 'x' found in multiple base classes of different types
x++; // OK, B::x hides V::x
^
p44.cpp:13:16: note: member found by ambiguous name lookup
struct A { int x; }; // S(x,A) = { { A::x }, { A } }
^
p44.cpp:14:18: note: member found by ambiguous name lookup
struct B { float x; }; // S(x,B) = { { B::x }, { B } }
^
p44.cpp:44:1: error: no matching function for call to 'f'
f(); // OK, B::f() hides V::f()
^
p44.cpp:35:6: note: candidate function not viable: requires single argument 'pd', but no arguments were provided
void f(D* pd) {
^
p44.cpp:45:1: error: use of undeclared identifier 'y'
y++; // error: B::y and C’s W::y
^
p44.cpp:46:1: error: use of undeclared identifier 'g'
g(); // error: B::g() and C’s W::g()
^
p44.cpp:48:8: error: redefinition of 'V'
struct V { int f(); int x; };
^
p44.cpp:24:8: note: previous definition is here
struct V {
^
p44.cpp:50:8: error: redefinition of 'B'
struct B : virtual V, W {
^
p44.cpp:14:8: note: previous definition is here
struct B { float x; }; // S(x,B) = { { B::x }, { B } }
^
p44.cpp:54:8: error: redefinition of 'C'
struct C : virtual V, W { };
^
p44.cpp:15:8: note: previous definition is here
struct C: public A, public B { }; // S(x,C) = { invalid, { A in C, B in C } }
^
p44.cpp:55:8: error: redefinition of 'D'
struct D : B, C { void glorp(); };
^
p44.cpp:16:8: note: previous definition is here
struct D: public virtual C { }; // S(x,D) = S(x,C)
^
p44.cpp:57:8: error: redefinition of 'V'
struct V { };
^
p44.cpp:24:8: note: previous definition is here
struct V {
^
p44.cpp:58:8: error: redefinition of 'A'
struct A { };
^
p44.cpp:13:8: note: previous definition is here
struct A { int x; }; // S(x,A) = { { A::x }, { A } }
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
rm: cannot remove 'p44l': No such file or directory
$ clang++ p44.cpp -std=2b -o p44l -I. -Wall
p44.cpp:27:8: error: redefinition of 'A'
struct A {
^
p44.cpp:13:8: note: previous definition is here
struct A { int x; }; // S(x,A) = { { A::x }, { A } }
^
p44.cpp:32:8: error: redefinition of 'B'
struct B : A, virtual V { };
^
p44.cpp:14:8: note: previous definition is here
struct B { float x; }; // S(x,B) = { { B::x }, { B } }
^
p44.cpp:33:8: error: redefinition of 'C'
struct C : A, virtual V { };
^
p44.cpp:15:8: note: previous definition is here
struct C: public A, public B { }; // S(x,C) = { invalid, { A in C, B in C } }
^
p44.cpp:34:8: error: redefinition of 'D'
struct D : B, C { };
^
p44.cpp:16:8: note: previous definition is here
struct D: public virtual C { }; // S(x,D) = S(x,C)
^
p44.cpp:36:5: error: no member named 'v' in 'D'
pd->v++; // OK, only one v (virtual)
~~ ^
p44.cpp:37:5: error: no member named 's' in 'D'
pd->s++; // OK, only one s (static)
~~ ^
p44.cpp:38:13: error: no member named 'e' in 'D'
int i = pd->e; // OK, only one e (enumerator)
~~ ^
p44.cpp:39:5: error: no member named 'a' in 'D'
pd->a++; // error: ambiguous: two as in D
~~ ^
p44.cpp:42:9: error: out-of-line definition of 'glorp' does not match any declaration in 'D'
void D::glorp() {
^~~~~
p44.cpp:43:1: error: member 'x' found in multiple base classes of different types
x++; // OK, B::x hides V::x
^
p44.cpp:13:16: note: member found by ambiguous name lookup
struct A { int x; }; // S(x,A) = { { A::x }, { A } }
^
p44.cpp:14:18: note: member found by ambiguous name lookup
struct B { float x; }; // S(x,B) = { { B::x }, { B } }
^
p44.cpp:44:1: error: no matching function for call to 'f'
f(); // OK, B::f() hides V::f()
^
p44.cpp:35:6: note: candidate function not viable: requires single argument 'pd', but no arguments were provided
void f(D* pd) {
^
p44.cpp:45:1: error: use of undeclared identifier 'y'
y++; // error: B::y and C’s W::y
^
p44.cpp:46:1: error: use of undeclared identifier 'g'
g(); // error: B::g() and C’s W::g()
^
p44.cpp:48:8: error: redefinition of 'V'
struct V { int f(); int x; };
^
p44.cpp:24:8: note: previous definition is here
struct V {
^
p44.cpp:50:8: error: redefinition of 'B'
struct B : virtual V, W {
^
p44.cpp:14:8: note: previous definition is here
struct B { float x; }; // S(x,B) = { { B::x }, { B } }
^
p44.cpp:54:8: error: redefinition of 'C'
struct C : virtual V, W { };
^
p44.cpp:15:8: note: previous definition is here
struct C: public A, public B { }; // S(x,C) = { invalid, { A in C, B in C } }
^
p44.cpp:55:8: error: redefinition of 'D'
struct D : B, C { void glorp(); };
^
p44.cpp:16:8: note: previous definition is here
struct D: public virtual C { }; // S(x,D) = S(x,C)
^
p44.cpp:57:8: error: redefinition of 'V'
struct V { };
^
p44.cpp:24:8: note: previous definition is here
struct V {
^
p44.cpp:58:8: error: redefinition of 'A'
struct A { };
^
p44.cpp:13:8: note: previous definition is here
struct A { int x; }; // S(x,A) = { { A::x }, { A } }
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
$ g++ p44.cpp -std=03 -o p44g -I. -Wall
p44.cpp: In function 'int main()':
p44.cpp:21:3: error: request for member 'x' is ambiguous
21 | f.x = 0; // OK, lookup finds E::x
| ^
p44.cpp:14:18: note: candidates are: 'float B::x'
14 | struct B { float x; }; // S(x,B) = { { B::x }, { B } }
| ^
p44.cpp:13:16: note: 'int A::x'
13 | struct A { int x; }; // S(x,A) = { { A::x }, { A } }
| ^
p44.cpp: At global scope:
p44.cpp:27:8: error: redefinition of 'struct A'
27 | struct A {
| ^
p44.cpp:13:8: note: previous definition of 'struct A'
13 | struct A { int x; }; // S(x,A) = { { A::x }, { A } }
| ^
p44.cpp:32:8: error: redefinition of 'struct B'
32 | struct B : A, virtual V { };
| ^
p44.cpp:14:8: note: previous definition of 'struct B'
14 | struct B { float x; }; // S(x,B) = { { B::x }, { B } }
| ^
p44.cpp:33:8: error: redefinition of 'struct C'
33 | struct C : A, virtual V { };
| ^
p44.cpp:15:8: note: previous definition of 'struct C'
15 | struct C: public A, public B { }; // S(x,C) = { invalid, { A in C, B in C } }
| ^
p44.cpp:34:8: error: redefinition of 'struct D'
34 | struct D : B, C { };
| ^
p44.cpp:16:8: note: previous definition of 'struct D'
16 | struct D: public virtual C { }; // S(x,D) = S(x,C)
| ^
p44.cpp: In function 'void f(D*)':
p44.cpp:36:5: error: 'struct D' has no member named 'v'
36 | pd->v++; // OK, only one v (virtual)
| ^
p44.cpp:37:5: error: 'struct D' has no member named 's'
37 | pd->s++; // OK, only one s (static)
| ^
p44.cpp:38:13: error: 'struct D' has no member named 'e'
38 | int i = pd->e; // OK, only one e (enumerator)
| ^
p44.cpp:39:5: error: 'struct D' has no member named 'a'
39 | pd->a++; // error: ambiguous: two as in D
| ^
p44.cpp:38:5: warning: unused variable 'i' [-Wunused-variable]
38 | int i = pd->e; // OK, only one e (enumerator)
| ^
p44.cpp: At global scope:
p44.cpp:42:6: error: no declaration matches 'void D::glorp()'
42 | void D::glorp() {
| ^
p44.cpp:42:6: note: no functions named 'void D::glorp()'
p44.cpp:16:8: note: 'struct D' defined here
16 | struct D: public virtual C { }; // S(x,D) = S(x,C)
| ^
p44.cpp:48:8: error: redefinition of 'struct V'
48 | struct V { int f(); int x; };
| ^
p44.cpp:24:8: note: previous definition of 'struct V'
24 | struct V {
| ^
p44.cpp:50:8: error: redefinition of 'struct B'
50 | struct B : virtual V, W {
| ^
p44.cpp:14:8: note: previous definition of 'struct B'
14 | struct B { float x; }; // S(x,B) = { { B::x }, { B } }
| ^
p44.cpp:54:8: error: redefinition of 'struct C'
54 | struct C : virtual V, W { };
| ^
p44.cpp:15:8: note: previous definition of 'struct C'
15 | struct C: public A, public B { }; // S(x,C) = { invalid, { A in C, B in C } }
| ^
p44.cpp:55:8: error: redefinition of 'struct D'
55 | struct D : B, C { void glorp(); };
| ^
p44.cpp:16:8: note: previous definition of 'struct D'
16 | struct D: public virtual C { }; // S(x,D) = S(x,C)
| ^
p44.cpp:57:8: error: redefinition of 'struct V'
57 | struct V { };
| ^
p44.cpp:24:8: note: previous definition of 'struct V'
24 | struct V {
| ^
p44.cpp:58:8: error: redefinition of 'struct A'
58 | struct A { };
| ^
p44.cpp:13:8: note: previous definition of 'struct A'
13 | struct A { int x; }; // S(x,A) = { { A::x }, { A } }
| ^
p44.cpp:59:8: error: redefinition of 'struct B'
59 | struct B : A, virtual V { };
| ^
p44.cpp:14:8: note: previous definition of 'struct B'
14 | struct B { float x; }; // S(x,B) = { { B::x }, { B } }
| ^
p44.cpp:60:8: error: redefinition of 'struct C'
60 | struct C : A, virtual V { };
| ^
p44.cpp:15:8: note: previous definition of 'struct C'
15 | struct C: public A, public B { }; // S(x,C) = { invalid, { A in C, B in C } }
| ^
p44.cpp:61:8: error: redefinition of 'struct D'
61 | struct D : B, C { };
| ^
p44.cpp:16:8: note: previous definition of 'struct D'
16 | struct D: public virtual C { }; // S(x,D) = S(x,C)
| ^
p44.cpp: In function 'void g()':
p44.cpp:66:9: error: cannot convert 'D*' to 'V*' in initialization
66 | V* pv = &d; // OK, only one V subobject
| ^~
| |
| D*
p44.cpp:64:4: warning: unused variable 'pb' [-Wunused-variable]
64 | B* pb = &d;
| ^~
p44.cpp:65:4: warning: unused variable 'pa' [-Wunused-variable]
65 | A* pa = &d; // error: ambiguous: C’s A or B’s A?
| ^~
p44.cpp:66:4: warning: unused variable 'pv' [-Wunused-variable]
66 | V* pv = &d; // OK, only one V subobject
| ^~
p44.cpp: At global scope:
p44.cpp:79:8: error: redefinition of 'struct D'
79 | struct D: I1, I2, B2 {
| ^
p44.cpp:16:8: note: previous definition of 'struct D'
16 | struct D: public virtual C { }; // S(x,D) = S(x,C)
| ^
p44.cpp:91:5: error: redefinition of 'int main()'
91 | int main() { return sq(9);// OK, sq from module
| ^~~~
p44.cpp:19:5: note: 'int main()' previously defined here
19 | int main() {
| ^~~~
p44.cpp: In function 'int main()':
p44.cpp:91:21: error: 'sq' was not declared in this scope
91 | int main() { return sq(9);// OK, sq from module
| ^~
rm: cannot remove 'p44g': No such file or directory
$ g++ p44.cpp -std=2b -o p44g -I. -Wall
p44.cpp: In function 'int main()':
p44.cpp:21:3: error: request for member 'x' is ambiguous
21 | f.x = 0; // OK, lookup finds E::x
| ^
p44.cpp:14:18: note: candidates are: 'float B::x'
14 | struct B { float x; }; // S(x,B) = { { B::x }, { B } }
| ^
p44.cpp:13:16: note: 'int A::x'
13 | struct A { int x; }; // S(x,A) = { { A::x }, { A } }
| ^
p44.cpp: At global scope:
p44.cpp:27:8: error: redefinition of 'struct A'
27 | struct A {
| ^
p44.cpp:13:8: note: previous definition of 'struct A'
13 | struct A { int x; }; // S(x,A) = { { A::x }, { A } }
| ^
p44.cpp:32:8: error: redefinition of 'struct B'
32 | struct B : A, virtual V { };
| ^
p44.cpp:14:8: note: previous definition of 'struct B'
14 | struct B { float x; }; // S(x,B) = { { B::x }, { B } }
| ^
p44.cpp:33:8: error: redefinition of 'struct C'
33 | struct C : A, virtual V { };
| ^
p44.cpp:15:8: note: previous definition of 'struct C'
15 | struct C: public A, public B { }; // S(x,C) = { invalid, { A in C, B in C } }
| ^
p44.cpp:34:8: error: redefinition of 'struct D'
34 | struct D : B, C { };
| ^
p44.cpp:16:8: note: previous definition of 'struct D'
16 | struct D: public virtual C { }; // S(x,D) = S(x,C)
| ^
p44.cpp: In function 'void f(D*)':
p44.cpp:36:5: error: 'struct D' has no member named 'v'
36 | pd->v++; // OK, only one v (virtual)
| ^
p44.cpp:37:5: error: 'struct D' has no member named 's'
37 | pd->s++; // OK, only one s (static)
| ^
p44.cpp:38:13: error: 'struct D' has no member named 'e'
38 | int i = pd->e; // OK, only one e (enumerator)
| ^
p44.cpp:39:5: error: 'struct D' has no member named 'a'
39 | pd->a++; // error: ambiguous: two as in D
| ^
p44.cpp:38:5: warning: unused variable 'i' [-Wunused-variable]
38 | int i = pd->e; // OK, only one e (enumerator)
| ^
p44.cpp: At global scope:
p44.cpp:42:6: error: no declaration matches 'void D::glorp()'
42 | void D::glorp() {
| ^
p44.cpp:42:6: note: no functions named 'void D::glorp()'
p44.cpp:16:8: note: 'struct D' defined here
16 | struct D: public virtual C { }; // S(x,D) = S(x,C)
| ^
p44.cpp:48:8: error: redefinition of 'struct V'
48 | struct V { int f(); int x; };
| ^
p44.cpp:24:8: note: previous definition of 'struct V'
24 | struct V {
| ^
p44.cpp:50:8: error: redefinition of 'struct B'
50 | struct B : virtual V, W {
| ^
p44.cpp:14:8: note: previous definition of 'struct B'
14 | struct B { float x; }; // S(x,B) = { { B::x }, { B } }
| ^
p44.cpp:54:8: error: redefinition of 'struct C'
54 | struct C : virtual V, W { };
| ^
p44.cpp:15:8: note: previous definition of 'struct C'
15 | struct C: public A, public B { }; // S(x,C) = { invalid, { A in C, B in C } }
| ^
p44.cpp:55:8: error: redefinition of 'struct D'
55 | struct D : B, C { void glorp(); };
| ^
p44.cpp:16:8: note: previous definition of 'struct D'
16 | struct D: public virtual C { }; // S(x,D) = S(x,C)
| ^
p44.cpp:57:8: error: redefinition of 'struct V'
57 | struct V { };
| ^
p44.cpp:24:8: note: previous definition of 'struct V'
24 | struct V {
| ^
p44.cpp:58:8: error: redefinition of 'struct A'
58 | struct A { };
| ^
p44.cpp:13:8: note: previous definition of 'struct A'
13 | struct A { int x; }; // S(x,A) = { { A::x }, { A } }
| ^
p44.cpp:59:8: error: redefinition of 'struct B'
59 | struct B : A, virtual V { };
| ^
p44.cpp:14:8: note: previous definition of 'struct B'
14 | struct B { float x; }; // S(x,B) = { { B::x }, { B } }
| ^
p44.cpp:60:8: error: redefinition of 'struct C'
60 | struct C : A, virtual V { };
| ^
p44.cpp:15:8: note: previous definition of 'struct C'
15 | struct C: public A, public B { }; // S(x,C) = { invalid, { A in C, B in C } }
| ^
p44.cpp:61:8: error: redefinition of 'struct D'
61 | struct D : B, C { };
| ^
p44.cpp:16:8: note: previous definition of 'struct D'
16 | struct D: public virtual C { }; // S(x,D) = S(x,C)
| ^
p44.cpp: In function 'void g()':
p44.cpp:66:9: error: cannot convert 'D*' to 'V*' in initialization
66 | V* pv = &d; // OK, only one V subobject
| ^~
| |
| D*
p44.cpp:64:4: warning: unused variable 'pb' [-Wunused-variable]
64 | B* pb = &d;
| ^~
p44.cpp:65:4: warning: unused variable 'pa' [-Wunused-variable]
65 | A* pa = &d; // error: ambiguous: C’s A or B’s A?
| ^~
p44.cpp:66:4: warning: unused variable 'pv' [-Wunused-variable]
66 | V* pv = &d; // OK, only one V subobject
| ^~
p44.cpp: At global scope:
p44.cpp:79:8: error: redefinition of 'struct D'
79 | struct D: I1, I2, B2 {
| ^
p44.cpp:16:8: note: previous definition of 'struct D'
16 | struct D: public virtual C { }; // S(x,D) = S(x,C)
| ^
p44.cpp:91:5: error: redefinition of 'int main()'
91 | int main() { return sq(9);// OK, sq from module
| ^~~~
p44.cpp:19:5: note: 'int main()' previously defined here
19 | int main() {
| ^~~~
p44.cpp: In function 'int main()':
p44.cpp:91:21: error: 'sq' was not declared in this scope
91 | int main() { return sq(9);// OK, sq from module
|
検討事項(agenda)
Change the name of the variables.
算譜(source code)
p44.cpp
// C++N4910 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/n4910.pdf
const char * msg="6.5.2 Member name lookup [class.member.lookup] C++N4910:2022 (13) p44.cpp";
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
//[Example 1 :
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)
int main() {
F f;
f.x = 0; // OK, lookup finds E::x
}
// Example 2 :
struct V {
int v;
};
struct A2 {
int a;
static int s;
enum { e };
};
struct B2 : A2, virtual V { };
struct C2 : A2, virtual V { };
struct D2 : B2, C2 { };
void f(D2* pd) {
pd->v++; // OK, only one v (virtual)
pd->s++; // OK, only one s (static)
int i = pd->e; // OK, only one e (enumerator)
pd->a++; // error: ambiguous: two as in D
}
// [Example 3 :
void D3::glorp() {
x++; // OK, B::x hides V::x
f(); // OK, B::f() hides V::f()
y++; // error: B::y and C’s W::y
g(); // error: B::g() and C’s W::g()
}
struct V { int f(); int x; };
struct W { int g(); int y; };
struct B3 : virtual V, W {
int f(); int x;
int g(); int y;
};
struct C3 : virtual V, W { };
struct D3 : B3, C3 { void glorp(); };
// [Example 4 :
struct V4 { };
struct A4 { };
struct B4 : A, virtual V4 { };
struct C4 : A, virtual V4 { };
struct D4 : B4, C4 { };
void g() {
D4 d;
B4* pb = &d;
A4* pa = &d; // error: ambiguous: C’s A or B’s A?
V4* pv = &d; // OK, only one V subobject
}
// [Example 5 :
struct B1 {
void f();
static void f(int);
int i;
};
struct B2 {
void f(double);
};
struct I1: B1 { };
struct I2: B1 { };
struct D5: I1, I2, B2 {
using B1::f;
using B2::f;
void g() {
f(); // Ambiguous conversion of this
f(0); // Unambiguous (static)
f(0.0); // Unambiguous (only one B2)
int B1::* mpB1 = &D::i; // Unambiguous
int D5::* mpD = &D::i; // Ambiguous conversion
}
};
int main() { return sq(9);// OK, sq from module
cout<< msg << endl;
return EXIT_SUCCESS;
}
編纂・実行結果(compile and go)
bash
# ./clgc.sh p44
rm: cannot remove 'p44l': No such file or directory
rm: cannot remove 'p44g': No such file or directory
$ clang++ p44.cpp -std=03 -o p44l -I. -Wall
p44.cpp:39:5: error: non-static member 'a' found in multiple base-class subobjects of type 'A2':
struct D2 -> struct B2 -> struct A2
struct D2 -> struct C2 -> struct A2
pd->a++; // error: ambiguous: two as in D
^
p44.cpp:28:5: note: member found by ambiguous name lookup
int a;
^
p44.cpp:42:6: error: use of undeclared identifier 'D3'
void D3::glorp() {
^
p44.cpp:48:8: error: redefinition of 'V'
struct V { int f(); int x; };
^
p44.cpp:24:8: note: previous definition is here
struct V {
^
p44.cpp:65:5: error: cannot initialize a variable of type 'A4 *' with an rvalue of type 'D4 *'
A4* pa = &d; // error: ambiguous: C’s A or B’s A?
^ ~~
p44.cpp:74:8: error: redefinition of 'B2'
struct B2 {
^
p44.cpp:32:8: note: previous definition is here
struct B2 : A2, virtual V { };
^
p44.cpp:81:7: error: no member named 'f' in 'B2'; did you mean '::D5::f'?
using B2::f;
^~~~~
::D5::f
p44.cpp:80:11: note: '::D5::f' declared here
using B1::f;
^
p44.cpp:83:1: error: ambiguous conversion from derived class 'D5' to base class 'B1':
struct D5 -> struct I1 -> struct B1
struct D5 -> struct I2 -> struct B1
f(); // Ambiguous conversion of this
^
p44.cpp:86:22: error: no member named 'i' in 'D'
int B1::* mpB1 = &D::i; // Unambiguous
~~~^
p44.cpp:87:21: error: no member named 'i' in 'D'
int D5::* mpD = &D::i; // Ambiguous conversion
~~~^
p44.cpp:91:5: error: redefinition of 'main'
int main() { return sq(9);// OK, sq from module
^
p44.cpp:19:5: note: previous definition is here
int main() {
^
p44.cpp:91:21: error: use of undeclared identifier 'sq'
int main() { return sq(9);// OK, sq from module
^
11 errors generated.
rm: cannot remove 'p44l': No such file or directory
$ clang++ p44.cpp -std=2b -o p44l -I. -Wall
p44.cpp:39:5: error: non-static member 'a' found in multiple base-class subobjects of type 'A2':
struct D2 -> struct B2 -> struct A2
struct D2 -> struct C2 -> struct A2
pd->a++; // error: ambiguous: two as in D
^
p44.cpp:28:5: note: member found by ambiguous name lookup
int a;
^
p44.cpp:42:6: error: use of undeclared identifier 'D3'
void D3::glorp() {
^
p44.cpp:48:8: error: redefinition of 'V'
struct V { int f(); int x; };
^
p44.cpp:24:8: note: previous definition is here
struct V {
^
p44.cpp:65:5: error: cannot initialize a variable of type 'A4 *' with an rvalue of type 'D4 *'
A4* pa = &d; // error: ambiguous: C’s A or B’s A?
^ ~~
p44.cpp:74:8: error: redefinition of 'B2'
struct B2 {
^
p44.cpp:32:8: note: previous definition is here
struct B2 : A2, virtual V { };
^
p44.cpp:81:7: error: no member named 'f' in 'B2'; did you mean '::D5::f'?
using B2::f;
^~~~~
::D5::f
p44.cpp:80:11: note: '::D5::f' declared here
using B1::f;
^
p44.cpp:83:1: error: ambiguous conversion from derived class 'D5' to base class 'B1':
struct D5 -> struct I1 -> struct B1
struct D5 -> struct I2 -> struct B1
f(); // Ambiguous conversion of this
^
p44.cpp:86:22: error: no member named 'i' in 'D'
int B1::* mpB1 = &D::i; // Unambiguous
~~~^
p44.cpp:87:21: error: no member named 'i' in 'D'
int D5::* mpD = &D::i; // Ambiguous conversion
~~~^
p44.cpp:91:5: error: redefinition of 'main'
int main() { return sq(9);// OK, sq from module
^
p44.cpp:19:5: note: previous definition is here
int main() {
^
p44.cpp:91:21: error: use of undeclared identifier 'sq'
int main() { return sq(9);// OK, sq from module
^
11 errors generated.
$ g++ p44.cpp -std=03 -o p44g -I. -Wall
p44.cpp: In function 'int main()':
p44.cpp:21:3: error: request for member 'x' is ambiguous
21 | f.x = 0; // OK, lookup finds E::x
| ^
p44.cpp:14:18: note: candidates are: 'float B::x'
14 | struct B { float x; }; // S(x,B) = { { B::x }, { B } }
| ^
p44.cpp:13:16: note: 'int A::x'
13 | struct A { int x; }; // S(x,A) = { { A::x }, { A } }
| ^
p44.cpp: In function 'void f(D2*)':
p44.cpp:39:5: error: request for member 'a' is ambiguous
39 | pd->a++; // error: ambiguous: two as in D
| ^
p44.cpp:28:5: note: candidates are: 'int A2::a'
28 | int a;
| ^
p44.cpp:28:5: note: 'int A2::a'
p44.cpp:38:5: warning: unused variable 'i' [-Wunused-variable]
38 | int i = pd->e; // OK, only one e (enumerator)
| ^
p44.cpp: At global scope:
p44.cpp:42:6: error: 'D3' has not been declared
42 | void D3::glorp() {
| ^~
p44.cpp: In function 'void glorp()':
p44.cpp:43:1: error: 'x' was not declared in this scope
43 | x++; // OK, B::x hides V::x
| ^
p44.cpp:44:2: error: too few arguments to function 'void f(D2*)'
44 | f(); // OK, B::f() hides V::f()
| ~^~
p44.cpp:35:6: note: declared here
35 | void f(D2* pd) {
| ^
p44.cpp:45:1: error: 'y' was not declared in this scope
45 | y++; // error: B::y and C’s W::y
| ^
p44.cpp:46:1: error: 'g' was not declared in this scope
46 | g(); // error: B::g() and C’s W::g()
| ^
p44.cpp: At global scope:
p44.cpp:48:8: error: redefinition of 'struct V'
48 | struct V { int f(); int x; };
| ^
p44.cpp:24:8: note: previous definition of 'struct V'
24 | struct V {
| ^
p44.cpp: In function 'void g()':
p44.cpp:65:10: error: cannot convert 'D4*' to 'A4*' in initialization
65 | A4* pa = &d; // error: ambiguous: C’s A or B’s A?
| ^~
| |
| D4*
p44.cpp:64:5: warning: unused variable 'pb' [-Wunused-variable]
64 | B4* pb = &d;
| ^~
p44.cpp:65:5: warning: unused variable 'pa' [-Wunused-variable]
65 | A4* pa = &d; // error: ambiguous: C’s A or B’s A?
| ^~
p44.cpp:66:5: warning: unused variable 'pv' [-Wunused-variable]
66 | V4* pv = &d; // OK, only one V subobject
| ^~
p44.cpp: At global scope:
p44.cpp:74:8: error: redefinition of 'struct B2'
74 | struct B2 {
| ^~
p44.cpp:32:8: note: previous definition of 'struct B2'
32 | struct B2 : A2, virtual V { };
| ^~
p44.cpp:81:11: error: 'f' has not been declared in 'struct B2'
81 | using B2::f;
| ^
p44.cpp: In member function 'void D5::g()':
p44.cpp:83:2: error: 'B1' is an ambiguous base of 'D5'
83 | f(); // Ambiguous conversion of this
| ~^~
p44.cpp:86:22: error: 'i' is not a member of 'D'
86 | int B1::* mpB1 = &D::i; // Unambiguous
| ^
p44.cpp:87:21: error: 'i' is not a member of 'D'
87 | int D5::* mpD = &D::i; // Ambiguous conversion
| ^
p44.cpp:86:11: warning: unused variable 'mpB1' [-Wunused-variable]
86 | int B1::* mpB1 = &D::i; // Unambiguous
| ^~~~
p44.cpp:87:11: warning: unused variable 'mpD' [-Wunused-variable]
87 | int D5::* mpD = &D::i; // Ambiguous conversion
| ^~~
p44.cpp: At global scope:
p44.cpp:91:5: error: redefinition of 'int main()'
91 | int main() { return sq(9);// OK, sq from module
| ^~~~
p44.cpp:19:5: note: 'int main()' previously defined here
19 | int main() {
| ^~~~
p44.cpp: In function 'int main()':
p44.cpp:91:21: error: 'sq' was not declared in this scope
91 | int main() { return sq(9);// OK, sq from module
| ^~
rm: cannot remove 'p44g': No such file or directory
$ g++ p44.cpp -std=2b -o p44g -I. -Wall
p44.cpp: In function 'int main()':
p44.cpp:21:3: error: request for member 'x' is ambiguous
21 | f.x = 0; // OK, lookup finds E::x
| ^
p44.cpp:14:18: note: candidates are: 'float B::x'
14 | struct B { float x; }; // S(x,B) = { { B::x }, { B } }
| ^
p44.cpp:13:16: note: 'int A::x'
13 | struct A { int x; }; // S(x,A) = { { A::x }, { A } }
| ^
p44.cpp: In function 'void f(D2*)':
p44.cpp:39:5: error: request for member 'a' is ambiguous
39 | pd->a++; // error: ambiguous: two as in D
| ^
p44.cpp:28:5: note: candidates are: 'int A2::a'
28 | int a;
| ^
p44.cpp:28:5: note: 'int A2::a'
p44.cpp:38:5: warning: unused variable 'i' [-Wunused-variable]
38 | int i = pd->e; // OK, only one e (enumerator)
| ^
p44.cpp: At global scope:
p44.cpp:42:6: error: 'D3' has not been declared
42 | void D3::glorp() {
| ^~
p44.cpp: In function 'void glorp()':
p44.cpp:43:1: error: 'x' was not declared in this scope
43 | x++; // OK, B::x hides V::x
| ^
p44.cpp:44:2: error: too few arguments to function 'void f(D2*)'
44 | f(); // OK, B::f() hides V::f()
| ~^~
p44.cpp:35:6: note: declared here
35 | void f(D2* pd) {
| ^
p44.cpp:45:1: error: 'y' was not declared in this scope
45 | y++; // error: B::y and C’s W::y
| ^
p44.cpp:46:1: error: 'g' was not declared in this scope
46 | g(); // error: B::g() and C’s W::g()
| ^
p44.cpp: At global scope:
p44.cpp:48:8: error: redefinition of 'struct V'
48 | struct V { int f(); int x; };
| ^
p44.cpp:24:8: note: previous definition of 'struct V'
24 | struct V {
| ^
p44.cpp: In function 'void g()':
p44.cpp:65:10: error: cannot convert 'D4*' to 'A4*' in initialization
65 | A4* pa = &d; // error: ambiguous: C’s A or B’s A?
| ^~
| |
| D4*
p44.cpp:64:5: warning: unused variable 'pb' [-Wunused-variable]
64 | B4* pb = &d;
| ^~
p44.cpp:65:5: warning: unused variable 'pa' [-Wunused-variable]
65 | A4* pa = &d; // error: ambiguous: C’s A or B’s A?
| ^~
p44.cpp:66:5: warning: unused variable 'pv' [-Wunused-variable]
66 | V4* pv = &d; // OK, only one V subobject
| ^~
p44.cpp: At global scope:
p44.cpp:74:8: error: redefinition of 'struct B2'
74 | struct B2 {
| ^~
p44.cpp:32:8: note: previous definition of 'struct B2'
32 | struct B2 : A2, virtual V { };
| ^~
p44.cpp:81:11: error: 'f' has not been declared in 'struct B2'
81 | using B2::f;
| ^
p44.cpp: In member function 'void D5::g()':
p44.cpp:83:2: error: 'B1' is an ambiguous base of 'D5'
83 | f(); // Ambiguous conversion of this
| ~^~
p44.cpp:86:22: error: 'i' is not a member of 'D'
86 | int B1::* mpB1 = &D::i; // Unambiguous
| ^
p44.cpp:87:21: error: 'i' is not a member of 'D'
87 | int D5::* mpD = &D::i; // Ambiguous conversion
| ^
p44.cpp:86:11: warning: unused variable 'mpB1' [-Wunused-variable]
86 | int B1::* mpB1 = &D::i; // Unambiguous
| ^~~~
p44.cpp:87:11: warning: unused variable 'mpD' [-Wunused-variable]
87 | int D5::* mpD = &D::i; // Ambiguous conversion
| ^~~
p44.cpp: At global scope:
p44.cpp:91:5: error: redefinition of 'int main()'
91 | int main() { return sq(9);// OK, sq from module
| ^~~~
p44.cpp:19:5: note: 'int main()' previously defined here
19 | int main() {
| ^~~~
p44.cpp: In function 'int main()':
p44.cpp:91:21: error: 'sq' was not declared in this scope
91 | int main() { return sq(9);// OK, sq from module
| ^~
検討事項(agenda)
Change the variables which apeared in the error lines
算譜(source code)
p44.cpp
// C++N4910 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/n4910.pdf
const char * msg="6.5.2 Member name lookup [class.member.lookup] C++N4910:2022 (13) p44.cpp";
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
//[Example 1 :
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)
//int main() {
//F f;
//f.x = 0; // OK, lookup finds E::x
//}
// Example 2 :
struct V {
int v;
};
struct A2 {
int a;
static int s;
enum { e };
};
struct B6 : A2, virtual V { };
struct C2 : A2, virtual V { };
struct D2 : B6, C2 { };
void f(D2* pd) {
pd->v++; // OK, only one v (virtual)
pd->s++; // OK, only one s (static)
int i = pd->e; // OK, only one e (enumerator)
pd->a++; // error: ambiguous: two as in D
}
// [Example 3 :
struct V3 { int f(); int x; };
struct W { int g(); int y; };
struct B3 : virtual V3, W {
int f(); int x;
int g(); int y;
};
struct C3 : virtual V3, W { };
struct D3 : B3, C3 { void glorp(); };
void D3::glorp() {
x++; // OK, B::x hides V::x
f(); // OK, B::f() hides V::f()
y++; // error: B::y and C’s W::y
g(); // error: B::g() and C’s W::g()
}
// [Example 4 :
struct V4 { };
struct A4 { };
struct B4 : A, virtual V4 { };
struct C4 : A, virtual V4 { };
struct D4 : B4, C4 { };
void g() {
D4 d;
B4* pb = &d;
A4* pa = &d; // error: ambiguous: C’s A or B’s A?
V4* pv = &d; // OK, only one V subobject
}
// [Example 5 :
struct B1 {
void f();
static void f(int);
int i;
};
struct B2 {
void f(double);
};
struct I1: B1 { };
struct I2: B1 { };
struct D5: I1, I2, B2 {
using B1::f;
using B2::f;
void g() {
f(); // Ambiguous conversion of this
f(0); // Unambiguous (static)
f(0.0); // Unambiguous (only one B2)
int B1::* mpB1 = &D5::i; // Unambiguous
int D5::* mpD5 = &D5::i; // Ambiguous conversion
}
};
int main() { return sq(9);// OK, sq from module
F f;
f.x = 0; // Ok, lookup finds E::x
cout<< msg << endl;
return EXIT_SUCCESS;
}
編纂・実行結果(compile and go)
bash
# ./clgc.sh p44
rm: cannot remove 'p44l': No such file or directory
rm: cannot remove 'p44g': No such file or directory
$ clang++ p44.cpp -std=03 -o p44l -I. -Wall
p44.cpp:39:5: error: non-static member 'a' found in multiple base-class subobjects of type 'A2':
struct D2 -> struct B6 -> struct A2
struct D2 -> struct C2 -> struct A2
pd->a++; // error: ambiguous: two as in D
^
p44.cpp:28:5: note: member found by ambiguous name lookup
int a;
^
p44.cpp:53:1: error: member 'y' found in multiple base classes of different types
y++; // error: B::y and C’s W::y
^
p44.cpp:46:14: note: member found by ambiguous name lookup
int g(); int y;
^
p44.cpp:43:25: note: member found by ambiguous name lookup
struct W { int g(); int y; };
^
p44.cpp:54:1: error: member 'g' found in multiple base classes of different types
g(); // error: B::g() and C’s W::g()
^
p44.cpp:46:5: note: member found by ambiguous name lookup
int g(); int y;
^
p44.cpp:43:16: note: member found by ambiguous name lookup
struct W { int g(); int y; };
^
p44.cpp:65:5: error: cannot initialize a variable of type 'A4 *' with an rvalue of type 'D4 *'
A4* pa = &d; // error: ambiguous: C’s A or B’s A?
^ ~~
p44.cpp:83:1: error: ambiguous conversion from derived class 'D5' to base class 'B1':
struct D5 -> struct I1 -> struct B1
struct D5 -> struct I2 -> struct B1
f(); // Ambiguous conversion of this
^
p44.cpp:86:23: error: non-static member 'i' found in multiple base-class subobjects of type 'B1':
struct D5 -> struct I1 -> struct B1
struct D5 -> struct I2 -> struct B1
int B1::* mpB1 = &D5::i; // Unambiguous
~~~~^
p44.cpp:72:5: note: member found by ambiguous name lookup
int i;
^
p44.cpp:87:23: error: non-static member 'i' found in multiple base-class subobjects of type 'B1':
struct D5 -> struct I1 -> struct B1
struct D5 -> struct I2 -> struct B1
int D5::* mpD5 = &D5::i; // Ambiguous conversion
~~~~^
p44.cpp:72:5: note: member found by ambiguous name lookup
int i;
^
p44.cpp:91:21: error: use of undeclared identifier 'sq'
int main() { return sq(9);// OK, sq from module
^
8 errors generated.
rm: cannot remove 'p44l': No such file or directory
$ clang++ p44.cpp -std=2b -o p44l -I. -Wall
p44.cpp:39:5: error: non-static member 'a' found in multiple base-class subobjects of type 'A2':
struct D2 -> struct B6 -> struct A2
struct D2 -> struct C2 -> struct A2
pd->a++; // error: ambiguous: two as in D
^
p44.cpp:28:5: note: member found by ambiguous name lookup
int a;
^
p44.cpp:53:1: error: member 'y' found in multiple base classes of different types
y++; // error: B::y and C’s W::y
^
p44.cpp:46:14: note: member found by ambiguous name lookup
int g(); int y;
^
p44.cpp:43:25: note: member found by ambiguous name lookup
struct W { int g(); int y; };
^
p44.cpp:54:1: error: member 'g' found in multiple base classes of different types
g(); // error: B::g() and C’s W::g()
^
p44.cpp:46:5: note: member found by ambiguous name lookup
int g(); int y;
^
p44.cpp:43:16: note: member found by ambiguous name lookup
struct W { int g(); int y; };
^
p44.cpp:65:5: error: cannot initialize a variable of type 'A4 *' with an rvalue of type 'D4 *'
A4* pa = &d; // error: ambiguous: C’s A or B’s A?
^ ~~
p44.cpp:83:1: error: ambiguous conversion from derived class 'D5' to base class 'B1':
struct D5 -> struct I1 -> struct B1
struct D5 -> struct I2 -> struct B1
f(); // Ambiguous conversion of this
^
p44.cpp:86:23: error: non-static member 'i' found in multiple base-class subobjects of type 'B1':
struct D5 -> struct I1 -> struct B1
struct D5 -> struct I2 -> struct B1
int B1::* mpB1 = &D5::i; // Unambiguous
~~~~^
p44.cpp:72:5: note: member found by ambiguous name lookup
int i;
^
p44.cpp:87:23: error: non-static member 'i' found in multiple base-class subobjects of type 'B1':
struct D5 -> struct I1 -> struct B1
struct D5 -> struct I2 -> struct B1
int D5::* mpD5 = &D5::i; // Ambiguous conversion
~~~~^
p44.cpp:72:5: note: member found by ambiguous name lookup
int i;
^
p44.cpp:91:21: error: use of undeclared identifier 'sq'
int main() { return sq(9);// OK, sq from module
^
8 errors generated.
$ g++ p44.cpp -std=03 -o p44g -I. -Wall
p44.cpp: In function 'void f(D2*)':
p44.cpp:39:5: error: request for member 'a' is ambiguous
39 | pd->a++; // error: ambiguous: two as in D
| ^
p44.cpp:28:5: note: candidates are: 'int A2::a'
28 | int a;
| ^
p44.cpp:28:5: note: 'int A2::a'
p44.cpp:38:5: warning: unused variable 'i' [-Wunused-variable]
38 | int i = pd->e; // OK, only one e (enumerator)
| ^
p44.cpp: In member function 'void D3::glorp()':
p44.cpp:53:1: error: reference to 'y' is ambiguous
53 | y++; // error: B::y and C’s W::y
| ^
p44.cpp:43:25: note: candidates are: 'int W::y'
43 | struct W { int g(); int y; };
| ^
p44.cpp:46:14: note: 'int B3::y'
46 | int g(); int y;
| ^
p44.cpp:54:1: error: reference to 'g' is ambiguous
54 | g(); // error: B::g() and C’s W::g()
| ^
p44.cpp:43:16: note: candidates are: 'int W::g()'
43 | struct W { int g(); int y; };
| ^
p44.cpp:46:5: note: 'int B3::g()'
46 | int g(); int y;
| ^
p44.cpp: In function 'void g()':
p44.cpp:65:10: error: cannot convert 'D4*' to 'A4*' in initialization
65 | A4* pa = &d; // error: ambiguous: C’s A or B’s A?
| ^~
| |
| D4*
p44.cpp:64:5: warning: unused variable 'pb' [-Wunused-variable]
64 | B4* pb = &d;
| ^~
p44.cpp:65:5: warning: unused variable 'pa' [-Wunused-variable]
65 | A4* pa = &d; // error: ambiguous: C’s A or B’s A?
| ^~
p44.cpp:66:5: warning: unused variable 'pv' [-Wunused-variable]
66 | V4* pv = &d; // OK, only one V subobject
| ^~
p44.cpp: In member function 'void D5::g()':
p44.cpp:83:2: error: 'B1' is an ambiguous base of 'D5'
83 | f(); // Ambiguous conversion of this
| ~^~
p44.cpp:86:23: error: reference to 'i' is ambiguous
86 | int B1::* mpB1 = &D5::i; // Unambiguous
| ^
p44.cpp:72:5: note: candidates are: 'int B1::i'
72 | int i;
| ^
p44.cpp:72:5: note: 'int B1::i'
p44.cpp:87:23: error: reference to 'i' is ambiguous
87 | int D5::* mpD5 = &D5::i; // Ambiguous conversion
| ^
p44.cpp:72:5: note: candidates are: 'int B1::i'
72 | int i;
| ^
p44.cpp:72:5: note: 'int B1::i'
p44.cpp:86:11: warning: unused variable 'mpB1' [-Wunused-variable]
86 | int B1::* mpB1 = &D5::i; // Unambiguous
| ^~~~
p44.cpp:87:11: warning: unused variable 'mpD5' [-Wunused-variable]
87 | int D5::* mpD5 = &D5::i; // Ambiguous conversion
| ^~~~
p44.cpp: In function 'int main()':
p44.cpp:91:21: error: 'sq' was not declared in this scope
91 | int main() { return sq(9);// OK, sq from module
| ^~
p44.cpp:93:5: error: request for member 'x' is ambiguous
93 | f.x = 0; // Ok, lookup finds E::x
| ^
p44.cpp:14:18: note: candidates are: 'float B::x'
14 | struct B { float x; }; // S(x,B) = { { B::x }, { B } }
| ^
p44.cpp:13:16: note: 'int A::x'
13 | struct A { int x; }; // S(x,A) = { { A::x }, { A } }
| ^
rm: cannot remove 'p44g': No such file or directory
$ g++ p44.cpp -std=2b -o p44g -I. -Wall
p44.cpp: In function 'void f(D2*)':
p44.cpp:39:5: error: request for member 'a' is ambiguous
39 | pd->a++; // error: ambiguous: two as in D
| ^
p44.cpp:28:5: note: candidates are: 'int A2::a'
28 | int a;
| ^
p44.cpp:28:5: note: 'int A2::a'
p44.cpp:38:5: warning: unused variable 'i' [-Wunused-variable]
38 | int i = pd->e; // OK, only one e (enumerator)
| ^
p44.cpp: In member function 'void D3::glorp()':
p44.cpp:53:1: error: reference to 'y' is ambiguous
53 | y++; // error: B::y and C’s W::y
| ^
p44.cpp:43:25: note: candidates are: 'int W::y'
43 | struct W { int g(); int y; };
| ^
p44.cpp:46:14: note: 'int B3::y'
46 | int g(); int y;
| ^
p44.cpp:54:1: error: reference to 'g' is ambiguous
54 | g(); // error: B::g() and C’s W::g()
| ^
p44.cpp:43:16: note: candidates are: 'int W::g()'
43 | struct W { int g(); int y; };
| ^
p44.cpp:46:5: note: 'int B3::g()'
46 | int g(); int y;
| ^
p44.cpp: In function 'void g()':
p44.cpp:65:10: error: cannot convert 'D4*' to 'A4*' in initialization
65 | A4* pa = &d; // error: ambiguous: C’s A or B’s A?
| ^~
| |
| D4*
p44.cpp:64:5: warning: unused variable 'pb' [-Wunused-variable]
64 | B4* pb = &d;
| ^~
p44.cpp:65:5: warning: unused variable 'pa' [-Wunused-variable]
65 | A4* pa = &d; // error: ambiguous: C’s A or B’s A?
| ^~
p44.cpp:66:5: warning: unused variable 'pv' [-Wunused-variable]
66 | V4* pv = &d; // OK, only one V subobject
| ^~
p44.cpp: In member function 'void D5::g()':
p44.cpp:83:2: error: 'B1' is an ambiguous base of 'D5'
83 | f(); // Ambiguous conversion of this
| ~^~
p44.cpp:86:23: error: reference to 'i' is ambiguous
86 | int B1::* mpB1 = &D5::i; // Unambiguous
| ^
p44.cpp:72:5: note: candidates are: 'int B1::i'
72 | int i;
| ^
p44.cpp:72:5: note: 'int B1::i'
p44.cpp:87:23: error: reference to 'i' is ambiguous
87 | int D5::* mpD5 = &D5::i; // Ambiguous conversion
| ^
p44.cpp:72:5: note: candidates are: 'int B1::i'
72 | int i;
| ^
p44.cpp:72:5: note: 'int B1::i'
p44.cpp:86:11: warning: unused variable 'mpB1' [-Wunused-variable]
86 | int B1::* mpB1 = &D5::i; // Unambiguous
| ^~~~
p44.cpp:87:11: warning: unused variable 'mpD5' [-Wunused-variable]
87 | int D5::* mpD5 = &D5::i; // Ambiguous conversion
| ^~~~
p44.cpp: In function 'int main()':
p44.cpp:91:21: error: 'sq' was not declared in this scope
91 | int main() { return sq(9);// OK, sq from module
| ^~
p44.cpp:93:5: error: request for member 'x' is ambiguous
93 | f.x = 0; // Ok, lookup finds E::x
| ^
p44.cpp:14:18: note: candidates are: 'float B::x'
14 | struct B { float x; }; // S(x,B) = { { B::x }, { B } }
| ^
p44.cpp:13:16: note: 'int A::x'
13 | struct A { int x; }; // S(x,A) = { { A::x }, { A } }
|
検討事項(agenda)
算譜(source code)
p44.cpp
編纂・実行結果(compile and go)
bash