比方说,我有下面这段代码。
#include <iostream>
template <size_t... Is> struct E {};
template <typename... Ts, size_t... Is>
void func (E<Is...>, Ts...) {std::cout << __PRETTY_FUNCTION__ << std::endl;}
int main()
{
func(E<1,2,3>{}, 1, 'a');
}
它工作得非常好,产生了
void func(E<Is ...>, Ts ...) [with Ts = {int, char}; long unsigned int ...Is = {1, 2, 3}]
但是,如果我把 func
呼叫 func<int, char, 1, 2, 3>(E<1,2,3>{}, 1, 'a');
这将导致编译错误,即。
template argument deduction/substitution failed
为什么编译器禁止显式指定多个参数包?
这是从模板参数推导的规则中得出的。
当你明确指定模板参数为 func
,编译器将把它与第一个参数包相匹配。贪婪. 编译器并没有发现,一旦你开始将 int
的参数中,它应该开始替换为 Is...
.
相反,它将继续以 Ts...
,你会得到一条错误信息,大致内容是:。
expected a type, but got 1
对于第三个明确指定的参数。
如果你指定了 只是 的 Ts...
,像这样。
func<int, char>(E<1,2,3>{}, 1, 'a');
这样编译就可以了