将具有默认参数值的函数作为模板参数传递

2023-12-22

我对以下行为有点困惑。我传递一个带有两个参数的函数,其中一个参数具有默认值,作为模板参数,并使用一个参数调用该函数。为什么编译失败?并且,解决方案/解决方法是什么?

#include <iostream>
using namespace std;

template<typename Function> 
void eval(Function function) {
    function(10);
}

void sum(int i, int j = 0) {
    cout << "Sum is " << i + j;
}

int main() {
    sum(10);    // OK, of course :)
    eval(sum);  // Error!
}

请注意,这个问题不是关于使用默认参数调用模板化函数。

错误信息:

prog.cpp: In instantiation of 'void eval(Function) [with Function = void (*)(int, int)]':
prog.cpp:15:10:   required from here
prog.cpp:6:10: error: too few arguments to function
  function(10);
          ^

这是因为可选参数是函数声明的一部分。当您使用函数指针调用时,编译器基本上只知道函数指针的类型。所以这一行function(10)大致翻译为:

void (*)(int, int) sm = function; // the equivalent happens at the type deduction step 
sm(10); // whoops, where is the second int

编译器将需要第二个参数,因为它无法知道是否sm正在指向sum它有一个默认参数,或其他一些void foo(int a, int b)它没有默认参数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将具有默认参数值的函数作为模板参数传递 的相关文章

  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • FFMPEG -filter_complex 绘制文本,样式如粗体斜体和下划线

    我正在尝试在视频的填充区域添加文本 有 4 到 5 件事我无法做 1 绘制文本样式 粗体 斜体 下划线 2 填充区域不透明度 3 字幕垂直对齐 当我给 VAlign 一些值时 有时会跑出窗外 如何正确计算 距离顶部 50 像素 或者距离底部
  • 如何通过我的 Web 服务运行 .exe 文件?

    复制 是否可以从 Web 服务运行可执行文件 https stackoverflow com questions 717657 is it possible to run an executable from a web service H
  • Android:ActionBar 在显示和隐藏时出现故障

    我想在单击时显示 隐藏操作栏 它确实显示和隐藏 但它并不平滑 底部隐藏但在消失之前有一段时间不同的背景 我什至在一个简单的 hello world 应用程序中尝试过 结果是相同的 这是代码 public void onCreate Bund
  • os.close(0) 和 sys.stdin.close() 之间的区别

    我正在编写一些 Python 代码 它是从 Apache 调用的 CGI 脚本 代码所做的第一件事是 我相信 尝试使用以下命令关闭 stdin stdout stderr for fd in 0 1 2 try os close fd ex
  • Websphere 由于 c3p0 挂起

    我正在使用 WAS 7 1 以及 c3p0 v 0 9 2 1 和 hibernate 3 2 6ga 使用几个小时后 Websphere 挂起 我在日志中看到此消息 6 24 13 10 57 50 377 CEST 00000031 T
  • React JS - 使用后退按钮获取以前的搜索

    因此 我编写了一个小型单页应用程序 它查询 API 并返回一堆结果 我将这些结果显示给用户在输入搜索词的输入字段下方 每次我输入新的搜索词并按 Enter 键时 都会重新查询 API 并使用新结果更新页面 但是 我希望能够单击浏览器中的后退
  • 无法向 FB 提交错误报告

    浏览 FB bug 后https developers facebook com bugs https developers facebook com bugs 并且没有找到我的问题的答案 我在 SO 上发布了一个问题 https stac
  • 如何在 C# 中检查数据库(ACCESS 或 SQL)中是否存在表

    我发现很多关于这个问题的问题 但是有没有什么简单的语句可以完成这个任务呢 对于 SQL 和 ACCESS IF EXISTS SELECT 1 FROM sys tables WHERE name table name BEGIN do s
  • 使用 SharedPreferences 保存多个 EditText 值

    我正在尝试构建一个应用程序 人们可以在其中填写个人数据 例如姓名 电话号码 电子邮件 对于上面提到的每个字段 我创建了一个EditText 现在我的目标是使用保存用户的输入SharedPreferences这样他 她就不必每次重新打开应用程
  • Docker 容器无法连接到远程 MongoDB

    我有一个flask基于 python 代码 只需连接到mongodb 有两条路线Get Post Get简单地打印hello world并使用Post我们可以发布任何稍后保存的 json 数据MongoDB这段 python 代码运行良好
  • 方法声明后的冒号?

    public function getRecords int id array 你好 有人能告诉我在 PHP 接口内的这个方法声明中冒号在这里做什么吗 这是 PHP 7 语法吗 数组在这里的含义是什么 方法必须返回数组还是其他东西 是的 这
  • GitHub 在存储库上运行 git-gc 的频率如何?

    假设 GitHub 偶尔运行git gc https git scm com docs git gc这种情况发生的频率如何 GitHub 支持回答了这个问题 https twitter com githubhelp status 38792
  • 在Python中进行函数链接时,有没有办法引用“当前”对象?

    假设我接受了以下课程 class foo object def init self int self count int def increment self int return foo int 1 def decrement self
  • 自定义日历视图

    I want to develop custom calendarView for my app i think i can make it by use of UICollectionView like this 我尝试了这个简单的事情
  • 使用 Python 函数高效处理 DataFrame 行?

    在我们使用 Pandas 的代码中的很多地方 我们都有一些 Python 函数process row 该函数被使用过DataFrame iterrows 取每个row 并进行一些处理 并返回一个值 我们最终将其收集到一个新的值中Series
  • 空析构函数有什么作用?

    我听说空析构函数不执行任何操作 并且调用它不会删除对象 但在代码中 include
  • 代码隐藏中调用代码隐藏函数的 ASP.Net 按钮

    我正在使用 Telerik RadControls 在我的代码隐藏中我有以下函数 其中一部分向页脚添加按钮 Protected Sub RadGrid1 ItemCreated ByVal sender As Object ByVal e
  • 从 C/C++ 定义/实例化 Java 对象

    我的java代码如下所示 class MyClass public void MyFunc ISomeListener listener 我想从 C 程序调用此方法并向其传递所需的参数 请注意 该参数是接口的实现 因此我需要define A
  • 从 Eclipse Marketplace 下载 Eclipse 插件以供离线使用

    我想要安装的插件 Eclipse Jubula Database Drivers 仅在 Eclipse Marketplace 中可用 但是 我需要将其安装到在未连接到 Internet 的计算机上运行的 Eclipse 包 有什么方法可以
  • 将具有默认参数值的函数作为模板参数传递

    我对以下行为有点困惑 我传递一个带有两个参数的函数 其中一个参数具有默认值 作为模板参数 并使用一个参数调用该函数 为什么编译失败 并且 解决方案 解决方法是什么 include