Аргумент шаблона '(тип) 0' не соответствует 'EnumValue' - PullRequest
0 голосов
/ 07 сентября 2018

Учитывая этот код 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>()), "");
                           ^

Если я использую int и 0 вместо Enum и EnumValue ошибка исчезла. Почему это не с перечислением?

1 Ответ

0 голосов
/ 10 сентября 2018

Кто-нибудь имеет представление о том, как обойти это на сломанных версиях GCC, сохраняя enum?

Вы можете стиснуть зубы и сказать компилятору, что он не может вывести:

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

Успех

Если неприглядность будет широко распространена, возможно, вы сможете локализовать ее в некоторой условно скомпилированной упаковке.

...