gpt4 book ai didi

c++ - C++11 模板参数类型推导失败

转载 作者:可可西里 更新时间:2023-11-01 17:00:51 25 4
gpt4 key购买 nike

我正在尝试了解如何使用 C++(11) <type_traits> .

这是我的简单测试程序

#include <type_traits>

template<class U, class S>
inline U add(typename std::enable_if<std::is_unsigned<U>::value,U>::type a,
typename std::enable_if<std::is_signed <S>::value,S>::type b)
{
return a + b;
}

int main(int argc, const char * argv[], const char * envp[])
{
unsigned int ui;
int i;
auto a = add(ui, i);
return 0;
}

当使用 GCC 4.8.1 编译时,它会出错

/home/per/f.cpp: In function ‘int main(int, const char**, const char**)’:
/home/per/f.cpp:15:23: error: no matching function for call to ‘add(unsigned int&, int&)’
auto a = add(ui, i);
^
/home/per/f.cpp:15:23: note: candidate is:
/home/per/f.cpp:5:10: note: template<class U, class S> U add(typename std::enable_if<std::is_unsigned<U>::value, U>::type, typename std::enable_if<std::is_signed<S>::value, S>::type)
inline U add(typename std::enable_if<std::is_unsigned<U>::value,U>::type a,
^
/home/per/f.cpp:5:10: note: template argument deduction/substitution failed:
/home/per/f.cpp:15:23: note: couldn't deduce template parameter ‘U’
auto a = add(ui, i);
^

我不知道为什么 GCC 不能推导出模板参数 U .任何人都知道我的代码缺少什么信息,这就是我如何用 C++11 编写一个程序,该程序将无符号整数类型作为第一个参数,并将有符号整数类型作为第二个参数?

最佳答案

typename std::enable_if<std::is_unsigned<U>::value,U>::type不是可推导的上下文。为了推导U由此,编译器需要能够应用 std::enable_if 的反向操作.看起来并不太难,这是真的,但那是因为你在谈论像 enable_if 这样的简单事情。 .不可能对每个特征都要求这个,所以 C++ 只是玩得很​​酷,不会产生任何奇怪的规则异常:它在一般情况下不可推导,在这一个中不可推导。

你也可以这样做:

template<class U, class S,
EnableIf<std::is_unsigned<U>, std::is_signed<S>>...>
U add(U a, S b)

或者在不正确支持该样式的编译器中,您可以添加一个额外的默认参数:

template<class U, class S>
U add(U a, S b,
typename std::enable_if<std::is_unsigned<U>::value
&& std::is_signed<S>::value,void>::type* = nullptr)

...或者弄乱返回类型。

template<class U, class S>
typename std::enable_if<std::is_unsigned<U>::value
&& std::is_signed<S>::value,U>::type
add(U a, S b)

关于c++ - C++11 <type_traits> 模板参数类型推导失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16986277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com