2015-05-21 38 views
0

我嘗試用gcc 4.9.2編譯在cygwin下下面的代碼:的Cygwin的std :: enable_if解析錯誤

#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環境或編譯器有什麼問題?

回答

0

解析錯誤是因爲:

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?

+1

是解釋,這是問題。謝謝。 – simon