首页 > 解决方案 > 具有相同参数的命名空间中的函数和函数之间的歧义

问题描述

谁能解释为什么 和 之间有A::f(const B& b)歧义f(const A::B& b)。我认为代码对意图非常明确。

#include <iostream>

namespace A
{
  class B
  {
  protected:
    double value_;
  public:
    B() : value_(15.0) {}
    double getValue() const {return value_;}
  };

  void f(const B& b)
  {
    std::cout << "f(b) = " << b.getValue() << std::endl;
  }
}

void f(const A::B& b)
{
  std::cout << "Other f(b) = " << b.getValue() << std::endl;
}

int main()
{
  A::B b;
  A::f(b);
  f(b);
  return 0;
}

error: call of overloaded ‘f(A::B&)’ is ambiguous但是,无论编译器标志和优化如何,g++ 7.5.0 和 clang 6.0.0 都抱怨函数调用不明确 ( )。

标签: c++namespacesfunction-callargument-dependent-lookup

解决方案


这是一个依赖于参数的查找的例子。

即使::main在全局命名空间中,也可以在不使用完全限定名称的情况下调用,因为它是在其参数A::f的命名空间中查找的, . 因此,和之间存在歧义。AA::B::fA::f

要解决歧义,您需要调用A::f(b)(如您所做的那样)或::f(b).


推荐阅读