【发布时间】:2014-08-11 10:42:03
【问题描述】:
我有一个名为 Traits 的结构,它是 T 类型的模板,Traits 有一个名为 Size 的字段。当 T 实际上有一个名为 Size 的字段时,代码编译并且一切正常。但是,当 T 是原生类型时,它显然没有 Size 字段并且代码无法编译
template <class T>
struct Traits
{
static const size_t Size = T::Size;
};
我尝试使用 SFINAE 编写它,但它仍然无法编译
template <class T>
struct Traits
{
static typename std::enable_if<!std::is_fundamental<T>::value, const size_t>::type Size = T::Size;
static typename std::enable_if< std::is_fundamental<T>::value, const size_t>::type Size = sizeof(T);
};
编译错误是
error : redeclaration of `typename std::enable_if<std::is_fundamental<T>::value, const unsigned int>::type Traits<T>::Size'
这没有任何意义,因为编译器认为我在重新声明 Size 但实际上这是不可能的,因为 T 要么是基本类型,要么不是,所以我希望 Size 只声明一次。
知道出了什么问题或如何规避此问题吗? (使用 gcc 4.8.3)
【问题讨论】: