为什么我会收到模板函数指针的链接器错误?

2023-12-20

我有一个 EventMgr 类,它有一个模板函数来注册侦听器。但是,当我注册监听器时,链接器给了我一个“错误 LNK2019:无法解析的外部符号".

开胃菜代码:

class EventMgr {

 template< class T, class EvenT>
 void RegisterListener(T* listener, int EventType, void (T::*MemFunc)(EvenT*) );
}

SoundMgr(它是一个侦听器)尝试注册事件:

SoundMgr::SoundMgr(void)
{
  EventManager::GetInstance()->RegisterListener(this, 1, (&SoundMgr::handleBulletFired));
}

我不确定为什么它不会链接。为什么找不到引用类型?


如果您只是在 .h 文件中声明模板,而实现则在 .cpp 文件中,那么您将收到此错误,因为 C++ 编译器一次只处理一个编译单元。当编译器发现您的代码调用刚刚声明的模板函数时,它将假定具体实例化将由其他编译单元完成(编译器无法知道在哪里可以找到该函数的 .cpp 文件)。 ..编译器一次只能看到一个 .cpp 和所有包含的 .h)。

如果模板参数来自众所周知的列表,您可以简单地请求 .cpp 中的程序所需的所有显式实现。

例如,如果您有一个模板函数

template<typename T>
T foo(T x)
{
   ...
}

你知道我们只是需要int foo(int); and string foo(string);那么只使用 .h 中的声明就可以了,只要您还在 .cpp 中添加两行:

template<> int foo(int);
template<> string foo(string);

通过这样做,您可以告诉编译器要构建什么专业化。如果您后来最终使用其他专业(例如vector<int> foo(vector<int>))那么您还必须在模板的 .cpp 文件中添加此显式实例化。

然而,在您查看代码的示例中,我猜您事先不知道将定义哪种类型的事件,因此无法完成此显式实例化。

另一种解决方案是简单地将整个模板实现放在 .h 文件中,而不是将声明与实现分开。有时这可能并不简单,因为需要您公开更多的实现细节,可能会引入更多的依赖项。

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

为什么我会收到模板函数指针的链接器错误? 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 此 NSPersistentStoreCoordinator 没有持久性存储(设备已锁定)。它无法执行保存操作。专门的静态方法

    尝试保存或更新记录时 应用程序在生产过程中随机崩溃 这是一个 VOIP 应用程序 获取后台 CallKit 推送 并在某些条件下将它们写入 CoreDate DB 我怀疑这就是导致应用程序崩溃的原因 但我在网上找不到任何关于它的参考 尝试在
  • 为什么某些浏览器中img宽度的结果不同?谁是正确的?

    这有一个演示 div img src https i imgur com iQ2rVup jpg style width 100 height 100px div 在 Codepen 上 https codepen io aaronbird
  • 在不同集合视图之间拖放单元格

    我在一个屏幕上有多个集合视图 在collectionView One中我有像Square这样的普通单元格 在 collectionView 两个中 我有组单元格 例如相同的单元格 但多个单元格被组的边框包围 我需要在一个集合视图与另一个集合
  • Android 约束布局奇怪的行为

    我的约束布局的版本是1 0 0 alpha8 当我在布局中包含工具栏后 工具栏的左侧和右侧都有空间 如下图所示 这是我的工具栏的代码
  • 多个向量的笛卡尔积

    类似的问题以前曾被问过 但我找不到与我的问题完全匹配的问题 我有 4 个向量 每个向量包含 200 500 个 4 位整数 每个向量中元素的确切数量各不相同 但我可以将其修复为特定值 我需要找到这 4 个向量中元素的所有可能组合 eg v1
  • Boto Ec2 和弹性 IP

    是否可以使用 python boto 将弹性 IP 地址与 ec2 实例关联 我正在尝试自动化部署 我在ec2部分搜索了api文档 但没有找到任何结果 不知道你在看什么文档 但它在那里 http boto readthedocs org e
  • Android Studio中的渲染问题

    我安装了最新版本Android Studio并创建了 hello world 应用程序 但是activity无法在预览窗格中呈现 我安装了所有最新的软件包SDK manager 显示的错误如下 java lang NoSuchFieldEr
  • Travis-CI 找不到相关模块需求

    我有一个正在运行 mocha 测试的 Travis 构建作业 但是构建失败并出现以下错误 Error Cannot find module sources reddit 我的文件树如下 feeds sources Reddit js Fee
  • Ruby:NoMethodError,但为什么呢?

    我在学习 Ruby 时正在开发一个简单的 Pi 生成器 但我在 RubyMine 6 3 3 上不断收到 NoMethodError 所以我决定用尽可能简单的方式创建一个新项目和新类 并且我STILL得到无方法错误 任何原因 class M
  • Android - 需要 ondraw() 视图示例的帮助

    我使用下面的代码来绘制视图 Override protected synchronized void onDraw Canvas canvas super onDraw canvas paint setStyle Style STROKE
  • Android Imageswitcher:定期切换图像?

    我正在使用带有 TouchListener 的 ImageSwitcher 来更改数组中的图像 它工作正常 但我希望它每隔 x 秒左右切换一次图像 以便我可以添加imageSwitcher setImageResource imageLis
  • 在 MS SQL Server 2005 中插入忽略?

    MS SQL Server 2005 中是否有 mysql 的 INSERT IGNORE 等效项或类似的功能 我不熟悉 mysql INSERT IGNORE 功能 但我正在阅读的文档听起来好像它所做的只是忽略 默默地失败 尝试插入表中已
  • Android Camera API - 强制关闭不会释放相机资源[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 因此 在开发自定义相机应用程序时 我在极少数情况下和在各种设备上意识到 如果应用程序必须强制关闭 它并不总是释放相机资源 有没有办法找
  • Django 模型过滤器存储在数据库中

    我正在 feincms 中处理内容类型 我想创建一个可以在数据库中存储过滤器的内容类型 大致看起来是这样的 from news models import Entry class NewsContent models Model filte
  • 无法在 RedHat Enterprise Linux 中使用 WebSphere MQ 8 配置 HermesJMS

    我正在尝试配置HermesJMS v1 14 with WebSphereMQ v8 0 但是我不能 我看过几个教程 并且遵循了它们 尽管没有一个完全是这些版本 这就是我所做的 我已经下载了这个试用版MQ V8 0 Trial for Mu
  • 如何在 Windows 10 上注册 ASP.NET?

    当我运行此命令时 出现以下错误 aspnet regiis exe i C Windows Microsoft NET Framework64 v4 0 30319 gt aspnet regiis exe i Microsoft R AS
  • 错误 ITMS-90432:Swift 支持无效。有解决办法吗?

    尝试将我的应用程序分发到 App Store Connect 时出现错误 这是我第一次遇到这个错误 我已经分发了 8 个不同版本的应用程序 没有出现任何错误 完整错误是 错误 ITMS 90432 Swift 支持无效 文件 APP NAM
  • IE8:选项标签默认获得“selected”属性(而cloneNode把它搞得一团糟)

    IE 似乎会自动在选项标签上添加 选定 属性 但如果你克隆Node它 事情就会变得奇怪 如果你在IE8中打开一个页面 代码如下
  • Cordova 忽略屏幕方向锁定[重复]

    这个问题在这里已经有答案了 我正在使用 Cordova 3 3 0 和我的 Galaxy S3 运行最新的 Cyanogenmod 来测试我正在开发的应用程序 我需要应用程序屏幕保持在 纵向 模式并被锁定 即使用户旋转设备也是如此 无论我尝
  • 为什么我会收到模板函数指针的链接器错误?

    我有一个 EventMgr 类 它有一个模板函数来注册侦听器 但是 当我注册监听器时 链接器给了我一个 错误 LNK2019 无法解析的外部符号 开胃菜代码 class EventMgr template lt class T class