gpt4 book ai didi

具有非 size_t 整数的 std::array 的 C++ 模板参数推导

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:34 27 4
gpt4 key购买 nike

我正在尝试调整 Avoiding struct in variadic template function 中提供的解决方案根据我的需要。但是,我无法理解 G++ 的行为。考虑以下功能:

 template <typename T, unsigned Size>
int nextline(const typename std::array<T, Size> ar) {
return 0;
}

然后调用

 nextline(std::array<int, 2> { 1,0 });

与 GCC 提示不匹配

eslong.cpp: In function ‘int main()’:
eslong.cpp:10:38: error: no matching function for call to ‘nextline(std::array<int, 2ul>)’
nextline(std::array<int, 2> { 1,0 });
^
eslong.cpp:10:38: note: candidate is:
eslong.cpp:4:5: note: template<class T, unsigned int Size> int nextline(std::array<T, Size>)
int nextline(const typename std::array<T, Size> ar) {
^
eslong.cpp:4:5: note: template argument deduction/substitution failed:
eslong.cpp:10:38: note: mismatched types ‘unsigned int’ and ‘#‘integer_cst’ not supported by dump_type#<type error>’
nextline(std::array<int, 2> { 1,0 });
^
eslong.cpp:10:38: note: ‘std::array<int, 2ul>’ is not derived from ‘std::array<T, Size>’

但是,如果我更改 unsigned Size 它会匹配至 unsigned long Sizesize_t .我不确定这里发生了什么。不是 Size调用中的参数 std::array<T, Size>转换为 size_t

最佳答案

std::array被模板化为:

template<class T, std::size_t N > struct array;

而大小 N 必须是 size_t 类型。但是在您的函数中,您正在传递一个无法解释为 size_t 的无符号 (int)。根据SFINAE如果无法推导出模板,则它不存在,因此您的模板化函数不存在。

这不是调用行的问题,而是函数模板的声明。要更正此问题,请使用正确的类型:

template <typename T, size_t Size>
int nextline(const typename std::array<T, Size> ar) {
return 0;
}

在这种情况下,即使您使用:

nextline(std::array<int, 2ul> { 1,0 });

它仍然有效,因为它可以被推导和转换。


dyp补充说明:

[temp.deduct.type]/17 for non-type template parameters that requires the type of the deduced thing (template-argument) to be of the same type as the template-parameter it is deduced for.

关于具有非 size_t 整数的 std::array 的 C++ 模板参数推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21740896/

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