Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从一个名称空间内调用多个名称空间中重载的函数_C++_Overloading - Fatal编程技术网

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(双重)标准已经说过了,那么。感谢您的澄清。这里缺少的一点是名称隐藏后应用名称篡改。如果是另一种情况,那么代码会像(错误的)预期的那样工作。我将发布这个答案,并对它进行测试,它对我来说编译得很好。(我还因为工作会议等而分心)。