C++ 依赖于参数的名称查找:添加要查找的额外命名空间

C++ 依赖于参数的名称查找:添加要查找的额外命名空间,c++,namespaces,argument-dependent-lookup,name-lookup,C++,Namespaces,Argument Dependent Lookup,Name Lookup,我想利用ADL规则检查额外命名空间中的函数: 假设我们有一个类X class X { ... }; 打电话 X x; f(x); 我希望编译器研究名称空间funky,到目前为止,它与类X无关。但我不想在调用f时,通过放置funky::f来混乱编码 实现这一点的一种方法是将类X定义为一个模板类,其参数来自名称空间funky template <typename Fake = funky::someClassFromFunky> class X { ... }; 模板

我想利用ADL规则检查额外命名空间中的函数:

假设我们有一个
类X

class X
 {
 ...
 };
打电话

X x;
f(x);
我希望编译器研究
名称空间funky
,到目前为止,它与
类X
无关。但我不想在调用
f
时,通过放置
funky::f
来混乱编码

实现这一点的一种方法是将
类X
定义为一个模板类,其参数来自
名称空间funky

template <typename Fake = funky::someClassFromFunky>
class X
 {
 ...
 };
模板
X类
{
...
};
对于调用
f(x)
,现在,编译器将确实查找
funky::f


是否有更干净/更简单的方法来实现相同的行为?(特别是,在
类X
的声明中引用某个任意类
someClassFromFunky
是很尴尬的。)

您可以像这样将f导入命名空间:

using funky::f;

这是正确的答案。需要注意的关键是,您可以在调用点执行此操作,而不仅仅是在全局范围内。我的问题是,我有大量来自funky的函数,在类X上运行,我想使用这些函数(不只是f,而是大约15个不同的函数)。为这些函数中的每一个都放一个using语句会很烦人。@MattHurst:我建议为每一个函数做一个using声明,把它们放在一起。这样,如果您正在搜索函数名,很容易发现它是从另一个命名空间导入的。而且,这样使用语句会导致不同的行为。使用<代码>使用,编译器也会考虑<代码> Funky::F<代码>代码>调用<代码> int;f(y)@Matt:但是,如果
X
在它自己的名称空间中,并且您使用
放入该名称空间,那么只有在调用
f(X)