В настоящее время я выполняю обновление с 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?