我有以下代码段:
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)可以调用而不使用显式作用域(::)?任何帮助表示赞赏。
答案 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>