考虑简单的代码:
template<int N> struct foo{};
namespace N
{
const int a=1;
void bar(foo<1>& x){}
}
int main()
{
bar(foo<N::a>());
return 0;
}
代码不应该有效吗?为什么它不工作我想知道。感谢
答案 0 :(得分:4)
[basic.lookup.argdep] / 2:
[注意:非类型模板参数不会对相关命名空间的集合做出贡献。-end note]
对于注释中链接的代码,命名空间中的typedef也不够,但出于其他原因。查找基于已解析的类型,而不是基于包含typedef
本身的命名空间(或等效地,using
)。
例如,如果您的代码如下:
namespace A {
class T {};
}
namespace B {
typedef A::T TT;
}
使用B::TT
作为参数会将namespace A
添加到查找中,但不会将namespace B
添加到查找中。