模板参数'(type)0'与'EnumValue'不匹配

时间:2018-09-07 15:08:44

标签: c++ c++11 g++ compiler-bug

给出以下C ++ 11代码:

#include <type_traits>

enum Enum { EnumValue };

template <typename>
struct Pred { constexpr static bool const value = true; };

template <
        typename T,
        typename ::std::enable_if<
            Pred<T>::value,
            Enum
        >::type = EnumValue>
class Huh {};

template <typename T>
constexpr bool f(Huh<T> const &) noexcept { return true; }

static_assert(f(Huh<int>()), "");

我从GCC 7.3.0收到以下错误消息:

test.cpp:19:27: error: no matching function for call to 'f(Huh<int>)'
 static_assert(f(Huh<int>()), "");
                           ^
test.cpp:17:16: note: candidate: template<class T> constexpr bool f(const Huh<T>&)
 constexpr bool f(Huh<T> const &) noexcept { return true; }
                ^
test.cpp:17:16: note:   template argument deduction/substitution failed:
test.cpp:19:27: note:   template argument '(type)0' does not match 'EnumValue'
 static_assert(f(Huh<int>()), "");
                           ^

如果我使用int0而不是EnumEnumValue,则错误消失了。 为什么此操作失败并带有枚举?

1 个答案:

答案 0 :(得分:1)

  

有人知道如何在保留枚举的情况下在GCC损坏的版本上解决此问题吗?

您可以咬紧牙关,并告诉编译器它不能演绎的内容:

static_assert(f<int>(Huh<int>()), "");

Success

如果看不见的东西很普遍,那么您可以将其定位在有条件的包装中。