namespace ns { struct S {}; voID sFoo(const S&) {} template<typename T> voID sbar(const S&) {}}voID foo(){ ns::S s; sFoo(s); // ok sbar<int>(s); // error: ‘sbar’ was not declared in this scope ns::sbar<int>(s); // ok}
我尝试了显式实例化,但它没有改变任何东西(即使它会,它会比使用使用更糟糕的选择).
那么为什么exacly不能在没有指定命名空间的情况下调用模板化函数(假设既不使用也不使用命名空间指令)?
解决方法 sbar不是一个函数,而是一个函数模板.依赖于参数的查找仅适用于函数名称.确实,sbar< int>是一个函数,但如果你不知道它的正确名称,你就无法实例化该模板!不相关的是,如果可以推导出模板参数,那ADL确实有效:
namespace ns{ template <typename T> voID sZip(T &) { }}voID foo(){ ns::S s; sZip(s); // OK,deduces T = ns::S}
C的一般“最佳实践”是仅在可以推导出参数的情况下制作函数模板,并且永远不要明确指定参数. (此规则的例外是std :: forward和各种make_ *函数,它们需要一个强制参数用于所需的结果类型.)
总结以上是内存溢出为你收集整理的c外部类接口和模板全部内容,希望文章能够帮你解决c外部类接口和模板所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)