C++ 可变参数模板函数错误 C2672“未找到匹配的重载函数”

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

我目前正在尝试熟悉 C++ 中的可变参数模板,但我有点遇到了某种障碍,其中每个递归实现都会给我错误 C2672。即使是我在网上视频中查找过的示例以及我见过的作品,出于某种原因也不适合我。

#include <iostream>

template<typename T, typename... Args>
T sum(T t, Args... args)
{
    return t + sum( args...);
}

template<typename T>
T sum(T t1, T t2)
{
    return t1 + t2;
}

int main()
{
    std::cout << sum(1, 2, 3, 4, 5) << std::endl;
}

严重性代码描述项目文件行抑制状态 消息可以是“T sum(T,Args...)”练习变量 D:*\Desktop\CPP Dev*\Exercise Variadics\Exercise Variadics\Main.cpp 4

错误 C2672“sum”:找不到匹配的重载函数Exercise Variadics D:*\Desktop\CPP Dev*\Exercise Variadics\Exercise Variadics\Main.cpp 6

消息“T sum(T,Args...)”:需要 2 个参数 - 0 个提供的练习 Variadics D:*\Desktop\CPP Dev*\Exercise Variadics\Exercise Variadics\Main.cpp 6

消息请参阅正在编译的函数模板实例化“T sum(T)”的参考Exercise Variadics D:*\Desktop\CPP Dev*\Exercise Variadics\Exercise Variadics\Main.cpp 6

消息请参阅正在编译的函数模板实例化“T sum(T,int)”的参考Exercise Variadics D:*\Desktop\CPP Dev*\Exercise Variadics\Exercise Variadics\Main.cpp 6

消息请参阅正在编译的函数模板实例化“T sum(T,int,int)”的参考Exercise Variadics D:*\Desktop\CPP Dev*\Exercise Variadics\Exercise Variadics\Main.cpp 6

消息请参阅正在编译的函数模板实例化“T sum(T,int,int,int)”的参考Exercise Variadics D:*\Desktop\CPP Dev*\Exercise Variadics\Exercise Variadics\Main.cpp 6

消息请参阅正在编译的函数模板实例化 'T sum(T,int,int,int,int)' 练习 Variadics D:*\Desktop\CPP Dev*\Exercise Variadics\Exercise Variadics\Main。 cpp 17

我已确定我使用的是 C++20。我在在线编译器上尝试了相同的代码,得到了相同的结果。

variadic-templates pack-expansion
1个回答
0
投票

编译器从不考虑第二个重载

sum(T, T)
,因为该重载在
sum(args...)
调用时不可见。

返回 t + sum(args...);

该行要求编译器调用某个具有非限定名称的函数

sum
。因此,编译器必须执行名称查找来查找此处要调用的函数。

非 ADL 查找将仅考虑那些在调用时可见的

sum()
声明。此时编译器唯一可见的
sum()
声明是递归声明。但这一声明至少需要一个参数。因此,一旦编译器将参数减少到零:
t + sum()
,该声明将不再与调用匹配,这正是这些错误消息所要传达的内容:

'sum':找不到匹配的重载函数 请参阅正在编译的函数模板实例化“T sum(T)”的参考

所以基本上你应该把终止过载放在前面:

#include <iostream>

template <typename T>
T sum(T t)
{
    return t;
}

template <typename T, typename... Args>
T sum(T t, Args... args)
{
    return t + sum(args...);
}

int main()
{
    std::cout << sum(1, 2, 3, 4, 5) << std::endl;
}
© www.soinside.com 2019 - 2024. All rights reserved.