模板推导失败,参数包后有参数
Template deduction fails with argument after parameter pack
我有这个功能:
template <typename... Args>
void f(Args... args, int last)
{
}
如果我在没有显式模板参数的情况下调用它,模板推导会失败:
f(2, 2); // candidate expects 1 argument, 2 provided
但是为参数包提供显式模板参数是可行的:
f<int>(2, 2); // compiles fine
尽管从逻辑上讲,编译器应该能够推断出参数包由除最后一个参数类型之外的所有参数组成。我该如何解决这个问题?
[temp.deduct.type]/p5:
The non-deduced contexts are:
- [...]
- A function parameter pack that does not occur at the end of the parameter-declaration-list.
要获得扣除,您必须做
template <typename... Args>
void f(Args... args)
{
}
并切掉正文中的最后一个参数,或者改为 last
first
:
template <typename... Args>
void f(int first, Args... args)
{
}
很难给出更具体的建议,因为我们不知道这个函数模板应该做什么。
来自[temp.deduct.type]:
The non-deduced contexts are:
[...] — A function parameter pack that does not occur at the end of the parameter-declaration-list.
您的参数包 args
是非推导上下文,因为它不是最后一个参数。非推导上下文,顾名思义,无法推导 - 这会导致模板推导失败。
当您显式提供模板参数(通过 f<int>(2, 2)
)时,无需进行推导,因此代码没有问题,您只是显式调用 f<int>(int, int)
。
我有这个功能:
template <typename... Args>
void f(Args... args, int last)
{
}
如果我在没有显式模板参数的情况下调用它,模板推导会失败:
f(2, 2); // candidate expects 1 argument, 2 provided
但是为参数包提供显式模板参数是可行的:
f<int>(2, 2); // compiles fine
尽管从逻辑上讲,编译器应该能够推断出参数包由除最后一个参数类型之外的所有参数组成。我该如何解决这个问题?
[temp.deduct.type]/p5:
The non-deduced contexts are:
- [...]
- A function parameter pack that does not occur at the end of the parameter-declaration-list.
要获得扣除,您必须做
template <typename... Args>
void f(Args... args)
{
}
并切掉正文中的最后一个参数,或者改为 last
first
:
template <typename... Args>
void f(int first, Args... args)
{
}
很难给出更具体的建议,因为我们不知道这个函数模板应该做什么。
来自[temp.deduct.type]:
The non-deduced contexts are:
[...] — A function parameter pack that does not occur at the end of the parameter-declaration-list.
您的参数包 args
是非推导上下文,因为它不是最后一个参数。非推导上下文,顾名思义,无法推导 - 这会导致模板推导失败。
当您显式提供模板参数(通过 f<int>(2, 2)
)时,无需进行推导,因此代码没有问题,您只是显式调用 f<int>(int, int)
。