【发布时间】:2019-05-16 08:44:39
【问题描述】:
我正在阅读 C++ 模板(第 2 版),这是本书中的一个 sn-p:
template<typename... Ts, int N>
void f(double (&)[N+1], Ts... ps) {return;}
书中明确指出,上面的声明是无用的,因为N不能指定或推导。
我试图了解为什么以下内容是错误的:
double arr[2];
f<int, double, 1>(arr, 1, 2.0);
当我编译上面的 sn-p 时,我得到一个错误,即没有匹配的函数来调用 f。
这编译得很好
template<typename... Ts, typename T>
void func(T value){};
func(1);
即使我在参数包之后还有一个附加参数。
为什么我指定的模板参数显式与提供的参数不匹配?请帮助我理解这一点。
【问题讨论】:
-
@πάντα ῥεῖ - 嗯......这编译得很好 - 模板
void func(T value){};函数(1);即使我在参数包之后还有一个附加参数。再一次,我在这里的问题与您所链接的问题不同,因为我不是要求编译器进行演绎,而是帮助它进行演绎。需要了解为什么会失败。 -
Clang 给出此通知“候选模板被忽略:模板参数 'Ts' 的显式指定参数无效”。调用
f<int, double>(arr, 1, 2.0)编译成功!f(arr, 1, 2.0)也是如此。所以看来N可以推断出来,至少在g++和clang++中是这样。 -
@CygnusX1....对不起我的错...我已经编辑了这个问题....它实际上是 N+1 而不是 N....
标签: c++ c++11 c++14 c++17 variadic-templates