C++11 枚举和所有其他类型的不同行为

C++11 枚举和所有其他类型的不同行为,c++11,enums,typetraits,C++11,Enums,Typetraits,使用gcc-4.8和-std=c++11,我想创建一个模板函数,其中一个行为用于枚举,另一个行为用于所有其他类型。我试试这个 #include <type_traits> #include <iostream> template<class T, class = typename std::enable_if<std::is_enum<T>::value>::type> void f(T& /*t*/) { std::

使用gcc-4.8和-std=c++11,我想创建一个模板函数,其中一个行为用于枚举,另一个行为用于所有其他类型。我试试这个

#include <type_traits>
#include <iostream>

template<class T, class = typename std::enable_if<std::is_enum<T>::value>::type>
void f(T& /*t*/)
{
    std::cout << "enum" << std::endl;
}

template<class T, class = typename std::enable_if<!std::is_enum<T>::value>::type>
void f(T& /*t*/) {
    std::cout << "not enum" << std::endl;
}

enum class E
{
    A,
    B
};

int main()
{
    E e;
    f(e);
    return 0;
}
#包括
#包括
模板
无效f(T&/*T*/)
{
标准::cout
但编译器返回

1.cpp:11:6: error: redefinition of ‘template<class T, class> void f(T&)’
 void f(T& /*t*/) {
      ^
1.cpp:5:6: error: ‘template<class T, class> void f(T&)’ previously declared here
 void f(T& /*t*/)
      ^
1.cpp:11:6:错误:重新定义“模板无效f(T&)”
无效f(T&/*T*/){
^
1.cpp:5:6:错误:“模板void f(T&)”之前在此处声明
无效f(T&/*T*/)
^
我可以注释掉第一个模板,它会导致编译错误,这是可以预料的。 我还可以注释出第二个模板,在这种情况下可以编译代码


我做错了什么?

因为编译器将它们视为相同的函数模板,所以您应该执行以下操作:

#include <type_traits>
#include <iostream>

template<class T, typename std::enable_if<std::is_enum<T>::value, bool>::type = true>
void f(T& /*t*/)
{
    std::cout << "enum" << std::endl;
}

template<class T, typename std::enable_if<!std::is_enum<T>::value, bool>::type = true>
void f(T& /*t*/) {
    std::cout << "not enum" << std::endl;
}

enum class E
{
    A,
    B
};

int main()
{
    E e;
    f(e);
    return 0;
}
#包括
#包括
模板
无效f(T&/*T*/)
{

std::除了默认模板参数外,这两个模板是否具有完全相同的签名,因此您要重新定义它,而不是声明重载。类似于您不能“重载”函数,其唯一区别是默认参数的值。