MSVC:显式模板实例化失败,而隐式实例化成功

时间:2016-08-15 09:21:10

标签: c++ visual-c++

我刚遇到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错误吗?是否有一种很好的方法来进行这些显式模板实例化?

0 个答案:

没有答案