Search code examples
c++c++11language-lawyerusing-declaration

Conflicting overloads with using-declaration


#include <iostream>
struct A {
  void test() { std::cout << "A\n"; }
};
struct B : A {
  void test() { std::cout << "B\n"; }
};
struct C : B {
  using A::test;
  using B::test;
};
int main() {
  C().test();  // Is this ambiguous?
  return 0;
}

In this example, g++ 8.1.0 compiles successfully and calls test() from B.

clang++ 3.8.0 reports: error: call to member function 'test' is ambiguous.

Which is correct? If it is g++, what is the rule that picks B::test over A::test?


Solution

  • I believe Clang is correct. According to [namespace.udecl]/13:

    Since a using-declaration is a declaration, the restrictions on declarations of the same name in the same declarative region ([basic.scope]) also apply to using-declarations.

    Since you can't declare two identical member functions, the same applies to using declarations.