gpt4 book ai didi

c++ - 模板参数包的错误推导

转载 作者:行者123 更新时间:2023-12-02 09:49:34 26 4
gpt4 key购买 nike

以下程序无法编译:

template <unsigned int dim, unsigned int N, bool P, bool C, class... ParametersType>
void test(ParametersType&&... par)
{
}

int main()
{
test<2, 3, true, false>(2, 1, {8, 8});
}

看到它 live on Coliru

错误讯息
g++ -std=c++17 -O1 -Wall -pedantic -pthread main.cpp && ./a.out

main.cpp: In function 'int main()':

main.cpp:8:41: error: too many arguments to function 'void test(ParametersType&& ...)
[with unsigned int dim = 2; unsigned int N = 3; bool P = true; bool C = false; ParametersType = {}]'

8 | test<2, 3, true, false>(2, 1, {8, 8});

| ^

main.cpp:2:6: note: declared here

2 | void test(ParametersType&&... par)

| ^~~~

表示参数包 ParametersType...推导为空,而我希望根据传递给 test的参数类型推导它。

问题出在传递给 {8, 8}test参数中。
显式传递 std::array到函数可以解决此问题:
#include <array>

template <unsigned int dim, unsigned int N, bool P, bool C, class... ParametersType>
void test(ParametersType&&... par)
{
}

int main()
{
test<2, 3, true, false>(2, 1, std::array<int, 2>{8, 8});
}

看到它 live on Coliru

为什么在第一个示例中,编译器显然错误地推导出了Pack?

如果编译器无法将 {8, 8}推导为 std::array,则可能会出现“无法推论”错误。为什么相反,编译器将包推导出为空?

最佳答案

模板错误很难纠正。这只是实现的质量。 lang实例

main.cpp:2:6: note: candidate template ignored: substitution failure 
[with dim = 2, N = 3, P = true, C = false]: deduced incomplete pack <int, int, (no value)>
for template parameter 'ParametersType'

这更容易理解。是的,除非使用 auto {stuff} has no type

关于c++ - 模板参数包的错误推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61326657/

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