使用enable_if隐藏函数定义

时间:2017-10-06 22:15:00

标签: c++ c++14 sfinae typetraits enable-if

有人可以帮助我理解为什么以下代码无法编译:

#include <type_traits>

class A{};
class B{};


template< typename T >
class C
{
  template< typename = std::enable_if_t<std::is_same<T, A>::value > >
  void foo()
  {}

  template< typename = std::enable_if_t<std::is_same<T, B>::value > >
  void foo()
  {}
};

错误消息:

t.cpp:15:8: error: class member cannot be redeclared
  void foo()
       ^
t.cpp:11:8: note: previous declaration is here
  void foo()
       ^
1 error generated.

我预计只有foo的一个定义是活跃的; T中的第一个等于AT中的第二个等于B

如果有人可以帮我修复代码,那就太棒了。

1 个答案:

答案 0 :(得分:2)

直接来自cppreference,强调我的:

  

一个常见的错误是声明两个仅在默认模板参数上有所不同的函数模板。这是非法的,因为默认模板参数不是功能模板的签名的一部分,并且声明具有相同签名的两个不同功能模板是非法的。

简单来说,两个函数签名都是:

template<typename>
void foo()