首页 > 解决方案 > 使用声明冲突的重载

问题描述

#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;
}

在本例中,g++ 8.1.0 编译成功,并test()B.

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

哪个是对的?如果是 g++,选择的规则是B::test什么A::test

标签: c++c++11language-lawyerusing-declaration

解决方案


我相信 Clang 是正确的。根据[namespace.udecl]/13

由于using-declaration是一个声明,因此对同一声明区域([basic.scope])中同名声明的限制也适用于using-declarations

由于您不能声明两个相同的成员函数,因此同样适用于using声明。


推荐阅读