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