C++ 从一个名称空间内调用多个名称空间中重载的函数
我有以下代码片段:C++ 从一个名称空间内调用多个名称空间中重载的函数,c++,overloading,C++,Overloading,我有以下代码片段: void foo(double a) {} namespace bar_space { struct Bar {}; void foo(Bar a) {} } foo(double)是库中的通用函数。 我有自己的名称空间bar\u space和自己的结构bar。我想为Bar实现foo()的重载,从而使Bar更类似于内置类型 尝试从命名空间内调用原始foo(double)时出现问题: namespace bar_space { void baz() {
void foo(double a) {}
namespace bar_space
{
struct Bar {};
void foo(Bar a) {}
}
foo(double)是库中的通用函数。
我有自己的名称空间bar\u 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_空间中工作)
bar_空间是否隐藏了原始函数?有没有一种方法可以使foo(5.0)在没有显式作用域(:)的情况下从bar_空间中调用?任何帮助都是值得赞赏的。 < P>是,BARSY空间隐藏了原始函数,不,不能在没有显式范围的C++空间中调用FO(5),如果在全局命名空间中定义了< < /St>Fu>(double)。基本上,如果嵌套范围中存在同名的函数/类,则函数或类名是“隐藏的”。这将防止编译器“看到”隐藏的名称
C++标准的3.3.7节:
名称可以通过显式 在声明中声明相同的名称 嵌套的声明性区域或派生的 班级(10.2)所以,回答你的问题:在你的例子中,
voidfoo(双a)代码>被void bar\u space::foo(bar a)隐藏因此,您需要使用:
作用域操作符来调用外部函数。但是,在示例代码中,您可以使用类似的内容
namespace bar_space
{
using ::foo;
void baz()
{
Bar bar;
foo(5.0);
foo(bar);
}
}
在C++中我是新手,但是你能使用BasyStudio:Foo,< <代码>之类的东西吗?代码>?这将有助于在Bar_空间外使用foo(Bar),但不会使foo(double)进入Bar_空间。类似的情况是可能的:好吧,我将使用::then。我没有提到它,但是foo()实际上是math.h中的函数ceil(),所以它是在全局名称空间中定义的。@Christian-如果您包含
(无论如何都应该这样做),那么ceil
将包含在std
名称空间中,在这种情况下,您的问题将消失。我刚刚做了。问题消失了。是的,我应该一直使用…没有bar_空格::foo(双重)标准已经说过了,那么。感谢您的澄清。这里缺少的一点是名称隐藏后应用名称篡改。如果是另一种情况,那么代码会像(错误的)预期的那样工作。我将发布这个答案,并对它进行测试,它对我来说编译得很好。(我还因为工作会议等而分心)。