C++ 理解SFINAE示例

C++ 理解SFINAE示例,c++,templates,c++14,sfinae,C++,Templates,C++14,Sfinae,我很难理解SFINAE。例如,我不理解为什么以下代码没有编译: #include <iostream> using namespace std; // first implementation template< size_t M, std::enable_if<M==1,size_t>::type = 0> int foo() { return 1; } // second implementation template< size_t M,

我很难理解SFINAE。例如,我不理解为什么以下代码没有编译:

#include <iostream>
using namespace std;

// first implementation
template< size_t M, std::enable_if<M==1,size_t>::type = 0>
int foo()
{
  return 1;
}

// second implementation
template< size_t M, std::enable_if<M!=1,size_t>::type = 0>
float foo()
{
  return 1.0f;
}

int main() {
  std::cout << foo<1>() << std::endl;

  return 0;
}
#包括
使用名称空间std;
//首次实施
模板
int foo()
{
返回1;
}
//第二次实施
模板
浮富()
{
返回1.0f;
}
int main(){
std::cout
不会导致替换错误,而
std::enable_如果
会导致替换错误


有人看到我的论点中的错误吗?

如评论中所述,如果
标准::启用,您必须在
之前添加
类型名称
,因为
::类型
是:


什么是错误信息?尝试在C++代码> STD::Enable……/<代码>之前添加“<代码>类型>:代码。大的常用不完全一致的编译器存在一些与模板重载有关的问题。如果错误来自该特定编译器,答案将非常不同。使用添加的
typename
编译:。
template< size_t M, typename std::enable_if<M==1,size_t>::type = 0>
int foo()
{
  return 1;
}
template< size_t M, std::enable_if_t<M==1,size_t> = 0>
int foo()
{
  return 1;
}