c – MSVC:显式模板实例化失败,而隐式实例化成功
发布时间:2020-12-16 06:52:20 所属栏目:百科 来源:网络整理
导读:我刚刚遇到MSVC(版本12更新5)的问题: 如果该函数具有通过SFINAE禁用的过载,则显式实例化模板函数失败.但是,调用该函数(从而暗示实例化它)是有效的. 示例代码: #include type_traitstemplate typename Tstd::enable_if_t std::is_integralT::value,// test
我刚刚遇到MSVC(版本12更新5)的问题:
如果该函数具有通过SFINAE禁用的过载,则显式实例化模板函数失败.但是,调用该函数(从而暗示实例化它)是有效的. 示例代码: #include <type_traits> template <typename T> std::enable_if_t< std::is_integral<T>::value,// test is true for T=int void> foo( T& ) {} template <typename T> std::enable_if_t< std::is_pointer<T>::value,// test is false for T=int void> foo( T& ) {} void bar( ) { int i; foo( i ); // calls foo( int& ) (obviously),compiles fine } template void foo( int& ); // explicit instantiation,throws compiler error 我得到的编译器错误是错误C2794:’type’:不是’std :: enable_if< false,void>‘的任何直接或间接基类的成员. 这是MSVC的错误吗?有没有一种很好的方法来进行这些显式模板实例化? 解决方法
以下允许实例化该函数,确保它编译并且应该(根据我的理解)也将它放入.obj文件中:
namespace { template <typename T> void helper( T& A ) { foo( A ); } template void helper( int& ); } 这里的诀窍是,helper(..)既不是重载,也不是任何类型的禁用.对已禁用的重载进行排序会延迟到帮助程序(..)中对foo(..)的“调用”,这是MSVC成功解决的问题. 编辑:正如我们已经看到其他编译器理解我的原始代码,以及更新版本的MSVC(感谢Niall),我认为这是我的MSVC版本的错误,并考虑到部分问题已经充分考虑过. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |