标题和代码不言自明,
这样的事情可能吗?怎么样?
鼓励吗?如果没有,有什么替代方案? 感谢
#include <iostream>
using namespace std;
namespace A
{
void foo()
{
cout << "In A\n";
}
}
namespace B
{
void foo()
{
cout << "In B\n";
}
}
template <typename X>
struct Foo {
void foo()
{
X::foo();
}
};
int main()
{
Foo<A> _foo;
_foo.foo();
return 0;
}
答案 0 :(得分:5)
您不能将名称空间用作模板类型(名称空间不是类型);你的代码没有编译。您可以期望的最好的方法是使用Argument Dependent Lookup (ADL),但它不适用于不带参数的函数。
答案 1 :(得分:3)
如果重命名成员函数,可以使用代理标记通过ADL找到它:
namespace A
{
struct tag {};
void foo(tag)
{
std::cout << "In A\n";
}
}
namespace B
{
struct tag {};
void foo(tag)
{
std::cout << "In B\n";
}
}
template<class Tag>
struct Foo {
void fooADL()
{
foo(Tag{});
}
};
int main()
{
Foo<A::tag> f;
f.fooADL();
}
答案 2 :(得分:2)
这样的事情可能吗?
不,你不能参数化命名空间。
如果没有,有什么替代方案?
使用类而不是名称空间为函数提供可参数化的范围:
struct A {
static void foo();
};
struct B {
static void foo();
}