在模板函数中,如下所示:
template<typename T> constexpr T foo(T a, T b) { return /*recursive call*/; }
我收到一条关于比较已签名与未签名(由于与sizeof
进行比较)的警告,我想删除。
从概念上讲,人们需要这样的东西:
template<typename T> constexpr T foo(T a, unsigned T b) { ... }
or
template<typename T> constexpr T foo(T a, std::make_unsigned<T>::type b) { ... }
不幸的是,第一个版本不是有效的C ++,第二个版本打破了构建,因为当编译器看到make_unsigned
时T不是限定类型。
是否有解决方案确实有效?
(注意:以某种方式与Get the signed/unsigned variant of an integer template parameter without explicit traits相关/几乎相同,虽然函数而不是类(因此没有typedef),特征或C ++ 11的任何特性明确欢迎,并且工作解决方案(即不 make_unsigned<T>
)首选。)
答案 0 :(得分:10)
你忘记了'typename'
template<typename T>
constexpr T foo(T a, typename std::make_unsigned<T>::type b) { ... }
在C ++ 14中,你应该能够写
template<typename T>
constexpr T foo(T a, std::make_unsigned_t<T> b) { ... }
或者您可以在C ++ 11中自己实现:
template<typename T>
using make_unsigned_t = typename std::make_unsigned<T>::type;