C++ 调用C++;另一命名空间中模板函数中的命名空间限定函数

C++ 调用C++;另一命名空间中模板函数中的命名空间限定函数,c++,namespaces,C++,Namespaces,如果在一个头文件的命名空间中定义了默认函数“foo”: //DefaultFoo.h namespace DefaultFooNamespace { template <typename T> void foo(T& x){/*...*/} } 有没有办法解决这个问题,这样我就可以定义bar并避免创建冗余代码来打开bar中的FooNamespace?我的解决方案是去掉无用的DefaultFooNamespace命名空间。将默认的foo放在与重载相同的命名空间

如果在一个头文件的命名空间中定义了默认函数“foo”:

//DefaultFoo.h
namespace DefaultFooNamespace
{
    template <typename T>
    void foo(T& x){/*...*/}
}

有没有办法解决这个问题,这样我就可以定义bar并避免创建冗余代码来打开bar中的FooNamespace?

我的解决方案是去掉无用的
DefaultFooNamespace
命名空间。将默认的
foo
放在与重载相同的命名空间中,然后
bar
只执行以下操作:

using FooNamespace::foo;
foo(x);
如果调用者没有为
x


我看不出默认的
foo
在一个单独的名称空间中的原因,特别是因为这样做需要一个单独的伪定义来生成
bar
有效的代码,而相同的重载可以同时用于这两个目的。

什么是foo.h?什么是App.h?你是说
使用foomloadsNamespace::foofoomloadsNamespace::foo
,否则代码>无法编译?因为C++就是这样工作的。为什么不能在Bar.h中包含“foooloadowals.h”?包括您使用的内容。抱歉,已编辑以修复某些命名错误的项目。但基本上我想说的是,FooOverloadsNamespace是可扩展的,可以分布在多个头文件中,但我必须任意选择其中一个,以便#包含在Bar.h中,这是行不通的。对于
bar
中的
foo(x)
调用,要找到正确的重载,必须看到该重载。您不能只包含一个重载,然后期望
使用FooOverloadsNamespace::foo
神奇地使所有标题中的所有重载都可用。
FooNamespace
应该是
FooOverloadsNamespace
?如果使用虚拟定义,则不需要单独的标题,只需将
名称空间foomloadsNamespace{struct dummy;void foo(dummy&);}
放在条的顶部即可。为什么说它不起作用?也许我解释错了-如果我#在bar.h中包含一个重载,然后调用bar,它会得到正确的重载,如果调用bar#的文件/函数包含其他重载.h文件.Hi,我有两个名称空间,因此我可以根据确定特定类型的foo是默认名称空间中的foo,还是重载名称空间中提供的优化foo的特征执行一些其他优化。然而,当我问这个问题时,我的思维混乱,你的建议很有帮助,所以我现在很高兴,所以我会把你的回答标记为接受。
//Bar.h
#include "DefaultFoo.h" 

namespace BarNamespace
{
    template <typename T>
    void bar(T& x)
    {
        //... do stuff then call foo
        using DefaultFooNamespace::foo;
        using FooOverloadsNamespace::foo;
        foo(x);
    }
}
//Dummy.h:
struct DummyClass
{
private:
    DummyClass(){}
};
namespace FooNamespace
{
    inline void foo(DummyClass& x);  //purely to open up namespace
}

//Bar.h
#include "Dummy.h"
using FooNamespace::foo;
foo(x);