Как этот typedef c ++ с использованием decltype и declval должен быть написан, чтобы сделать его переносимым?

У меня есть следующее

template <typename F, typename A0>
struct ResultOf {
typedef typename decltype(boost::declval<F>()(boost::declval<A0>())) Type;
};

Это было написано так, чтобы VS2010 мог иметь Результат это работало для конкретного случая использования. Он работает под vs2015, vs2013 и vs2010, но под gcc я получаю ошибку компиляции

error: expected nested-name-specifier before ‘decltype’
typedef typename decltype(boost::declval<F>()(boost::declval<A0>())) Type;

Здесь есть очевидное маленькое исправление?

2

Решение

typename Ключевое слово здесь не нужно. Он используется, в частности, для обозначения зависимого типа, например T::value_type, когда компилятор не может знать, value_type это тип. В данном случае нет зависимых типов.

2

Другие решения

Удаление typename работает в clang, gcc и современной msvc:

https://godbolt.org/z/CfOw-_

2

По вопросам рекламы [email protected]