有人可以帮助我理解为什么以下代码无法编译:
#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
中的第一个等于A
,T
中的第二个等于B
。
如果有人可以帮我修复代码,那就太棒了。
答案 0 :(得分:2)
直接来自cppreference,强调我的:
一个常见的错误是声明两个仅在默认模板参数上有所不同的函数模板。这是非法的,因为默认模板参数不是功能模板的签名的一部分,并且声明具有相同签名的两个不同功能模板是非法的。
简单来说,两个函数签名都是:
template<typename>
void foo()