功能模板查找问题

时间:2013-10-25 11:01:23

标签: c++

有人可以解释为什么以下代码在编译时给出错误(error C2065: 'select' : undeclared identifier):

namespace N { 
    class MyClass{ 

    }; 
    template<int I> void select(MyClass*)
    {}
}
void g (N::MyClass* mp) 
{ 
    select<10>(mp); 
}
void main()
{}

根据Argument Dependent Lookup,这应该可以正常工作,因为我在`g``s参数中指定了N::。因此,select应该对编译器可见。

为什么ADL不能在这里工作?

2 个答案:

答案 0 :(得分:0)

你试过N :: select吗? 无论是那个还是

using namespace N

应该有效,因为只有select不可见

答案 1 :(得分:0)

每次使用来自当前所在的名称空间的类时,必须直接引用它(N::select)或设置使用名称空间(using namespace N;)或设置直接使用声明以供将来使用(using N::select

为了消除歧义,我会查看thisthis,它们之间应该为您提供一个良好的开端,告诉您如何/为什么不能简单地调用select。

干杯,随时可以抓住我获取更多信息。