从一个名称空间内调用在多个名称空间中重载的函数

时间:2010-12-14 10:41:29

标签: c++ overloading

我有以下代码段:

void foo(double a) {}

namespace bar_space
{
  struct Bar {};

  void foo(Bar a) {}
}

foo(double)是库中的常规函数​​。 我有自己的命名空间bar_space和我自己的结构,Bar。我想为Bar实现foo()的重载,从而使Bar更类似于内置类型。

当我尝试从命名空间中调用原始foo(double)时出现麻烦:

namespace bar_space
{
  void baz()
  {
    foo(5.0); // error: conversion from ‘double’ to non-scalar type ‘ssc::bar_space::Bar’ requested
  }
}

这无法在我的Fedora和Mac上的gcc上编译。

致电

foo(5.0)

从命名空间外部或使用

namespace bar_space
{
  ::foo(5.0)
}

工作正常,但是这并没有让我的新功能像我希望的那样好(其他开发人员也在bar_space中工作)。

bar_space是否隐藏了原始函数?有没有办法让bar_space中的foo(5.0)可以调用而不使用显式作用域(::)?任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:8)

在C ++中,有一个名为name hiding的概念。基本上,如果嵌套范围中存在同名的函数/类,则函数或类名称将“隐藏”。这可以防止编译器“看到”隐藏名称。

C ++标准的3.3.7部分为:

  

名称可以通过显式隐藏   在a中声明同名   嵌套的声明区域或派生的   class(10.2)

所以,回答你的问题:在你的示例void foo(double a); 隐藏 void bar_space::foo(Bar a);所以你需要使用::作用域运算符来调用外部功能

答案 1 :(得分:2)

但是,在您的示例代码中,您可以使用类似的内容

namespace bar_space 
{
    using ::foo;
    void baz()
    {
       Bar bar;
       foo(5.0);
       foo(bar);
    }
}

答案 2 :(得分:1)

是的,bar_space隐藏了原始函数而不是,你不能在没有显式作用域的情况下从whithin bar_space调用foo(5.0)如果在全局命名空间中定义了 foo(double)。 / p>