【发布时间】:2022-08-23 02:12:16
【问题描述】:
以下程序编译成功。
template<typename T>
T sum(T x) {
return x;
}
template<typename T, typename... Args>
T sum(T x, Args... args) {
return x + sum(args...);
}
int main() {
sum(1, 2, 3, 4, 5);
}
但是,当我切换模板函数的编写顺序时,它不再编译:
template<typename T, typename... Args>
T sum(T x, Args... args) {
return x + sum(args...);
}
template<typename T>
T sum(T x) {
return x;
}
int main() {
sum(1, 2, 3, 4, 5);
}
我得到的编译器错误是:
错误 C2780:\'T sum(T,Args...)\':需要 2 个参数 - 提供了 0,消息:请参阅 \'sum\' 的声明
为什么会这样?在 main() 中调用之前不是已经定义了这两个函数吗?为什么它们的书写顺序很重要?
-
你的编译器错误是什么?
-
@jkb 错误 C2780:\'T sum(T,Args...)\':需要 2 个参数 - 提供了 0,消息:请参阅 \'sum\' 的声明
-
您的单个 arg
sum是终止递归的原因。 -
在非编译情况下,当定义第一个模板函数时,没有其他
sum(),因此它是明确的。在编译的情况下现在有两个sum()s,所以重载分辨率进入图片。规则相当晦涩难懂,但这就是胶囊摘要。 -
这不是问题,但如果您可以访问 C++17 编译器,则可以使用折叠并将
sum作为单个函数实现。 gcc.godbolt.org/z/M9caYv163
标签: c++ templates variadic-templates