$ 7.3.3/14(C ++ 03)

struct A { int x(); };
struct B : A { };
struct C : A {
   using A::x;
   int x(int);
};
struct D : B, C {
   using C::x;
   int x(double);
};
int f(D* d) {
   return d->x(); // ambiguous: B::x or C::x
}

“ f”中的代码中的评论表明,人们可以期望“ b :: x”或“ c :: x”之间的歧义。

但是,在使用G ++(IDEONE)或COMEAF编译时,错误略有不同。这些错误,而不是在B :: X或C :: X中表明歧义,表明A是D的模棱两可的基础

prog.cpp:在函数'int f(d*)'中:prog.cpp:16:错误:'a'是'd'的模棱两可的基础

“ comeAutest.c”,第21行:错误:base类“ a”是模棱两可的返回d-> x(); //模棱两可:b :: x或c :: x

按照$ 10.2的名字查找规则,我感到代码段中的评论不是真的正确。该错误确实是与基类“ A”的歧义相关的,而不是其他任何内容(例如,超载分辨率的歧义)。有什么想法吗?

有帮助吗?

解决方案

这是由C ++ 03中名称外观的转折引起的:检查明确的子对象是C ++ 03中类成员名称查找的一部分。 C ++ 03中的查找会找到D :: X和C :: X和A :: X,其中A :: X匹配,但与类型A的两个不同的子对象相关联

在C ++ 0x中,对明确的子对象的检查现在是各自的子分量的一部分,请参见 博士#39: :班级 x 是直接的是模棱两可的基础 - 因此,第5条将导致编译错误,而不是第10条。

请注意,评论谈到了 A. 。有一个子对象的 A 那走了道路 B, ,以及另一个子对象 A 那走了道路 C. 。这就是为什么评论说的“B::x 或者 C::x“。可以通过尝试将其转换为同类类型,忽略可访问性问题来确定同一类类型的多个子对象的存在:如果转换含糊不清,则该子对象出现多次。

其他提示

clang ++给出了G ++和Comeau产生的错误的组合

C:\Users\SUPER USER\Desktop>clang++ chubsdad.cpp
chubsdad.cpp(12) :  error: ambiguous conversion from derived class 'D' to base class
      'A':
    struct D -> struct B -> struct A
    struct D -> struct C -> struct A
   return d->x(); // ambiguous: B::x or C::x
          ^
1 error generated.
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top