2012-10-31 62 views
0

Possible Duplicate:
Where and why do I have to put the 「template」 and 「typename」 keywords?模板元編程GCC錯誤

有似乎是在GCC 4.5.3中的錯誤:與 g++ bug.cpp -std=c++0x

出現任何錯誤

#include <type_traits> 

template <bool isFundamentalType, bool isSomething> 
struct Foo 
{ 
    template <typename T> 
    static inline void* Do(size_t size); 
}; 

template <> 
struct Foo<true, false> 
{ 
    template <typename T> 
    static inline void* Do(size_t size) 
    { 
     return NULL; 
    } 
}; 

template <> 
struct Foo<false, false> 
{ 
    template <typename T> 
    static inline void* Do(size_t size) 
    { 
     return NULL; 
    } 
}; 

class Bar 
{ 
}; 

template <typename T> 
int Do(size_t size) 
{ 
    // The following fails 
    return (int) Foo<std::is_fundamental<T>::value, false>::Do<T>(size); 
    // This works -- why? 
    return (int) Foo<false, false>::Do<T>(size); 
} 

int main() 
{ 
    return Do<Bar>(10); 
} 

bug.cpp: In function ‘int Do(size_t)’: 
bug.cpp:37:65: error: expected primary-expression before ‘>’ token 

有一個已知的解決方法,可以讓我爲了解決這個問題?

編輯:MSVC 2010設法編譯這就好了。

+0

簡短回答:'Foo <...> :: template Do (size)'。 – Xeo

回答

2

您需要添加template

return (int) Foo<std::is_fundamental<T>::value, false>::template Do<T>(size); 

MSVC 2010編譯代碼,因爲它不能正確處理模板。

旁註

MSVC也注入到size_t全局命名空間,因爲長期承受的bug。從技術上講,你需要在其他編譯器中包含適當的頭文件。

+0

'#include '已經做到了。有人試圖搞笑,通過編輯搞砸了我的帖子。 –

+1

爲什麼這個工作雖然 - '返回(int)Foo ::做(大小);' –

+1

@ZachSaw Foo不依賴於我相信的模板參數。 – Pubby