GCC 4.5.3 中似乎存在一个错误:
#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);
}
编译为
g++ bug.cpp -std=c++0x
错误:
bug.cpp: In function ‘int Do(size_t)’:
bug.cpp:37:65: error: expected primary-expression before ‘>’ token
是否有已知的解决方法可以让我回避这个问题?
编辑:MSVC 2010 成功地编译了这个。
您需要添加
template
:
return (int) Foo<std::is_fundamental<T>::value, false>::template Do<T>(size);
MSVC 2010 编译代码,因为它无法正确处理模板。
旁注
由于长期存在的错误,MSVC 还将
size_t
注入到全局命名空间中。从技术上讲,您需要在其他编译器上包含正确的标头。