Ошибка компиляции gcc во время создания шаблона - PullRequest
1 голос
/ 02 октября 2019

В настоящее время я выполняю обновление с gcc 4.9 (c ++ 1) до gcc 8.2 (c ++ 14), и у меня есть проблема на gcc 8.2 со следующим кодом

#include <type_traits>
#include <iostream>

template <class T>
struct has_foo_method 
{
   struct not_found {};

   template <class C>
   static auto f(C* e) -> decltype(foo(*e));

   template <class>
   static auto f(...) -> not_found;

   using type = decltype(f<T>(nullptr));
   static const bool value = !std::is_same<not_found, type>::value;
};

template <class E, class E00 = std::decay_t<E>>
std::enable_if_t<!has_foo_method<E00>::value, typename has_foo_method<E00>::type>
foo(E&& e)
{
    return foo(std::forward<E>(e));
}

struct toto
{};

int main()
{
    std::cout << "same type : "<< (std::is_same<toto, std::decay<toto>::type>::value ? "TRUE" : "FALSE") << std::endl;
    std::cout << "foo methode  : " << (has_foo_method<toto>::value ? "TRUE" : "FALSE") << std::endl;
    std::cout << "foo methode for decay: " << (has_foo_method<std::decay_t<toto>>::value ? "TRUE" : "FALSE") << std::endl;
    foo(toto{});
    return 0;
}

Ошибкаявляется следующим:

source>: In substitution of 'template<class E, class E00> std::enable_if_t<(! has_foo_method<E00>::value), typename has_foo_method<E00>::type> foo(E&&) [with E = toto&; E00 = <missing>]':
...
<source>:19:20: fatal error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum)

Вы можете найти код и ошибку здесь

Я также обнаружил, что если я удалю E00 = std :: decay_t и заменим E00 наНапример:

template <class E>
std::enable_if_t<!has_foo_method<E>::value, typename has_foo_method<E>::type>

код компилируется, но я не могу понять, почему.

Знаете ли вы, почему он не компилируется в gcc 8.2, а в gcc 4.9?

...