Cygwin std::enable_if 解析错误
Cygwin std::enable_if parse error
我尝试在 cygwin 下用 gcc 4.9.2 编译以下代码:
#include <type_traits>
template <template <typename...> class C, typename... Ts>
class Foo
{
template <typename T> struct IsFoo : std::true_type {};
template<typename T> typename std::enable_if<IsFoo<T>::value>::type bar(T v);
};
template <template <typename...> class C, typename... Ts>
template <typename T>
typename std::enable_if<Foo<C, Ts...>::IsFoo<T>::value>::type
Foo<C, Ts...>::bar(T v)
{
return;
}
我收到以下错误:
$ gcc -std=c++11 b.cpp
b.cpp:13:15: error: parse error in template argument list
typename std::enable_if<Foo<C, Ts...>::IsFoo<T>::value>::type
^
b.cpp:13:48: error: too many template-parameter-lists
typename std::enable_if<Foo<C, Ts...>::IsFoo<T>::value>::type
^
奇怪的是,代码在 Linux (gcc 4.8.3) (http://goo.gl/uEQYB8) 下编译。我的 Cygwin 环境或编译器可能有什么问题?
解析错误是因为:
template <template <typename...> class C, typename... Ts>
template <typename T>
typename std::enable_if<Foo<C, Ts...>::IsFoo<T>::value>::type
Foo<C, Ts...>::bar(T v) { /**/ }
应该是:
template <template <typename...> class C, typename... Ts>
template <typename T>
typename std::enable_if<Foo<C, Ts...>::template IsFoo<T>::value>::type
// ~~~~~~~^
Foo<C, Ts...>::bar(T v) { /**/ }
如Where and why do I have to put the “template” and “typename” keywords?
中所述
我尝试在 cygwin 下用 gcc 4.9.2 编译以下代码:
#include <type_traits>
template <template <typename...> class C, typename... Ts>
class Foo
{
template <typename T> struct IsFoo : std::true_type {};
template<typename T> typename std::enable_if<IsFoo<T>::value>::type bar(T v);
};
template <template <typename...> class C, typename... Ts>
template <typename T>
typename std::enable_if<Foo<C, Ts...>::IsFoo<T>::value>::type
Foo<C, Ts...>::bar(T v)
{
return;
}
我收到以下错误:
$ gcc -std=c++11 b.cpp
b.cpp:13:15: error: parse error in template argument list
typename std::enable_if<Foo<C, Ts...>::IsFoo<T>::value>::type
^
b.cpp:13:48: error: too many template-parameter-lists
typename std::enable_if<Foo<C, Ts...>::IsFoo<T>::value>::type
^
奇怪的是,代码在 Linux (gcc 4.8.3) (http://goo.gl/uEQYB8) 下编译。我的 Cygwin 环境或编译器可能有什么问题?
解析错误是因为:
template <template <typename...> class C, typename... Ts>
template <typename T>
typename std::enable_if<Foo<C, Ts...>::IsFoo<T>::value>::type
Foo<C, Ts...>::bar(T v) { /**/ }
应该是:
template <template <typename...> class C, typename... Ts>
template <typename T>
typename std::enable_if<Foo<C, Ts...>::template IsFoo<T>::value>::type
// ~~~~~~~^
Foo<C, Ts...>::bar(T v) { /**/ }
如Where and why do I have to put the “template” and “typename” keywords?
中所述