ADL 查找函数模板失败
在 C 中,参数相关查找 (ADL) 可以在函数模板中搜索函数名称的声明与函数调用中的参数关联的命名空间。然而,C 规范中对于函数模板和 ADL 是有限制的。
限制
根据 C 标准 14.8.1.6,ADL 没有适用于函数模板,除非在调用时存在同名的可见函数模板。这意味着,对于具有显式模板参数的函数模板,调用必须具有带有可见函数模板的正确语法形式。
示例
考虑以下示例:
namespace ns { struct foo {}; template<int i> void frob(foo const&) {} void non_template(foo const&) {} } int main() { ns::foo f; non_template(f); // This is fine. frob<0>(f); // This is not. }
在此示例中,ADL 查找并解析第一次调用的 non_template,因为 non_template 是一个普通函数。然而,对于第二次调用,frob 是一个函数模板。由于调用时没有可见的 frob 函数模板,ADL 失败,并且调用在语法上格式不正确。
解决限制
至克服这个限制,确保函数模板在调用范围内可见。这可以通过在当前命名空间中声明函数模板或使用包含函数模板的命名空间来限定调用来实现。
以上是为什么 C 函数模板的参数相关查找 (ADL) 失败?的详细内容。更多信息请关注PHP中文网其他相关文章!