其他分享
首页 > 其他分享> > c – template中的enable_if参数创建模板重定义错误

c – template中的enable_if参数创建模板重定义错误

作者:互联网

this answer我真正想要做的是在我的模板参数中定义一个typename,可以在cast和return中使用.

所以这:

template <typename T>
typename std::enable_if<sizeof(unsigned char) == sizeof(T), unsigned char>::type caster(T value){ return reinterpret_cast<unsigned char&>(value); }

会变成这样的:

template <typename T, typename R = std::enable_if<sizeof(unsigned char) == sizeof(T), unsigned char>::type >
R caster(T value){ return reinterpret_cast<R&>(value); }

这适用于单个模板专业化的工作和行为,但是说我添加了另一个专门化:

template <typename T, typename R = std::enable_if<sizeof(short) == sizeof(T), short>::type>
R caster(T value){ return reinterpret_cast<R&>(value); }

现在我收到一个错误:

error C2995: ‘R caster(T)’ : function template has already been defined

有没有办法说服编译器这些特化中只有一个实际上会为任何给定的调用构建?

解决方法:

不,没有.模板默认参数就是默认值.任何用户都可以调用施法者< short,short>,这将匹配两个重载.

但是,可以添加更多伪参数.

template <typename T,
          typename R = typename std::enable_if<sizeof(unsigned char) == sizeof(T), unsigned char>::type >
R caster(T value) { return reinterpret_cast<R&>(value); }

template <typename T,
          typename R = typename std::enable_if<sizeof(short) == sizeof(T), short>::type,
          typename = void>
R caster(T value) { return reinterpret_cast<R&>(value); }

(另请注意添加的typename.)

但是,由于所有的身体都是相同的,我可能不会过载.

template <std::size_t N>
struct cast_result;

template <>
struct cast_result<sizeof(std::uint8_t)> {
  typedef std::uint8_t type;
};

template <>
struct cast_result<sizeof(std::uint16_t)> {
  typedef std::uint16_t type;
};

...

template <typename T, typename R = typename cast_result<sizeof(T)>::type>
R caster(T value) {
  return reinterpret_cast<R&>(value);
}

最后一点:这种reinterpret_cast的使用违反了别名规则.但是,这很容易修复:

template <typename T, typename R = typename cast_result<sizeof(T)>::type>
R caster(T value) {
  R result;
  std::memcpy(&result, &value, sizeof result);
  return result;
}

标签:typename,c,templates,enable-if,redefinition
来源: https://codeday.me/bug/20191002/1842118.html