我刚遇到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
我得到的编译器错误是error C2794: 'type' : is not a member of any direct or indirect base class of 'std::enable_if<false,void>'
。
GCC相同的代码似乎没问题(除了缺少主要功能):live on Ideone。
这是一个MSVC错误吗?是否有一种很好的方法来进行这些显式模板实例化?