代码之家  ›  专栏  ›  技术社区  ›  Chubsdad

名称查找中的重载解析/歧义(哪一个)

  •  4
  • Chubsdad  · 技术社区  · 14 年前

    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”之间可能存在歧义。

    prog.cpp:在函数int f(D*)中: prog.cpp:16:错误:A是 D的模糊基

    以及

    “A”类不明确

    按照$10.2中的名称查找规则,我感觉代码片段中的注释并不正确。这个错误实际上首先与基类“A”的模糊性有关,而不是其他任何东西(例如重载解析中的模糊性)。有什么想法吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Johannes Schaub - litb    14 年前

    这是由C++ 03中的名称查找中的一个扭曲引起的:检查一个明确的子对象是C++ 03中类成员名称查找的一部分。在C++ 03中查找将发现d::x和c::x和a::x,其中a::x匹配,但与类型A的两个不同子对象相关联。

    在C++0X中,对不明确的子对象的检查现在是各个子项的一部分,参见 DR #39 x is directly a member of is an digulary base-so子句5将导致编译错误,而不是子句10。

    请注意,该评论讨论了 A . 有一个子对象 越过了道路 B ,和另一个子对象 越过了道路 C . 这就是为什么评论说 B::x C::x ". 同一类类型的多个子对象的存在可以通过尝试转换为其类类型来确定,忽略可访问性问题:如果转换不明确,则该子对象出现多次。

        2
  •  0
  •   Prasoon Saurav    14 年前

    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.
    
    推荐文章