> 10.2/2 > (前略) > If the resulting set of declarations are not all from sub-objects of the same type, > or the set has a nonstatic member and includes members from distinct sub-objects, > there is an ambiguity and the program is ill-formed. 隠蔽を考えた上での member name lookup の結果が、 1) 同じ型の sub-objects 由来のものではない場合 2) 非静的メンバを持ち、かつ別個の sub-objects 由来のものを含む場合 のいずれかである場合、曖昧であり ill-formed である、そうな。 オーバーロードの解決はこの後(結果が曖昧でなかった場合)だそうで。 D&E (日本語訳) p.534 にも(非静的メンバだけど)例があった。
struct A { static void func(void) { std::cout << 'A' << std::endl; } }; struct B : public A {}; struct C : public A {}; struct D : public B, public C {}; struct E : public A { static void func(void) { std::cout << 'E' << std::endl; } }; struct F { static void func(void) { std::cout << 'F' << std::endl; } }; struct G : public A, public F {}; struct H : public A, public F { static void func(void) { std::cout << 'H' << std::endl; } };
int main(void) { B::func(); // A D::func(); // A E::func(); // E // G::func(); // error: `func' is not a member of `G' H::func(); // H return 0; }
int main() { int i = 12345678; double d = 1234.56; char* c = "test"; unsigned int j = 12; display_type(i); display_type(d); display_type(c); display_type(j); return 0; }
>14.3.1 Template type arguments >2 A local type, a type with no linkage, an unnamed type or a type compounded from >any of these types shall not be used as a templateargument for a template >typeparameter.