明确指定的模板参数包。

问题描述 投票:0回答:1

比方说,我有下面这段代码。

#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

为什么编译器禁止显式指定多个参数包?

c++ variadic-templates template-argument-deduction
1个回答
0
投票

这是从模板参数推导的规则中得出的。

当你明确指定模板参数为 func,编译器将把它与第一个参数包相匹配。贪婪. 编译器并没有发现,一旦你开始将 int的参数中,它应该开始替换为 Is....

相反,它将继续以 Ts...,你会得到一条错误信息,大致内容是:。

expected a type, but got 1

对于第三个明确指定的参数。

如果你指定了 只是Ts...,像这样。

func<int, char>(E<1,2,3>{}, 1, 'a');

这样编译就可以了

© www.soinside.com 2019 - 2024. All rights reserved.