我有以下代码片段:
void foo(double a) {}
namespace bar_space
{
struct Bar {};
void foo(Bar a) {}
}
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
这无法在我的Fedora和Mac上的gcc上编译.
调用
foo(5.0)
Run Code Online (Sandbox Code Playgroud)
从命名空间外部或使用
namespace bar_space
{
::foo(5.0)
}
Run Code Online (Sandbox Code Playgroud)
工作正常,但这并没有使我的新功能像我希望的那样好(其他开发人员也在bar_space内工作).
bar_space是否隐藏了原始函数?有没有办法让bar_space中的foo(5.0)可以调用而不使用显式作用域(::)?任何帮助表示赞赏.
在C++中,有一个名为hidden hidden的概念.基本上,如果嵌套范围中存在同名的函数/类,则函数或类名称将"隐藏".这可以防止编译器"看到"隐藏名称.
C++标准的3.3.7部分如下:
可以通过嵌套声明性区域或派生类中相同名称的显式声明来隐藏名称(10.2)
因此,要回答你的问题:在你的例子void foo(double a);是隐藏的void bar_space::foo(Bar a); 所以你需要使用::作用域运算符来调用外部函数.