可变参数模板的链接器错误

2024-01-11

我有一个带有可变参数模板和辅助函数的程序:

#include <iostream>
#include <string>

using std::cout;

template<typename... Ts>
void fooImpl(char const *cp, Ts... args);

template<typename... Ts>
inline void foo(const std::string &s, Ts... args)
{
    fooImpl(s.c_str(), args...);
}

void fooImpl(char const *cp)
{
    // do something
}

template<typename T, typename... Ts>
void fooImpl(char const *cp, T val, Ts... args)
{
    char special{'@'};

    while (*cp)
    {
        if (*cp == special)
        {
            // handle val ...

            // recurse over remaining args
            fooImpl(cp, args...);
            return;
        }
        ++cp;
    }    
}

int main()
{
    std::string s = "Hello!";
    foo("Text", s, "C++", 3.14159, 42);
}

这会产生链接器错误:

/tmp/ccZpPMC2.o:vt-test.cc:功能void foo<std::string, char const*, double, int>(std::string const&, std::string, char const*, double, int): error:
未定义的引用 'void fooImpl<std::string, char const*, double, int>(char const*, std::string, char const*, double, int)'

如果我输入以下定义,它可以正常编译和链接foo就在之前下降main()。 所以我认为这只是一个错误,但我在 GCC 4.9 和 clang 3.5 中得到了这个,所以也许我错过了一些东西?


template<typename T, typename... Ts>
void fooImpl(char const *cp, T val, Ts... args) { /* ... */ }

您正在声明原始模板的重载(!)。

既然在通话中

fooImpl(s.c_str(), args...);

there is a pack-expansion in the argument list, the unqualified-id denotes a dependent name1. Dependent name resolution applies. [temp.dep.candidate]:

对于依赖于模板参数的函数调用, 使用通常的查找规则(3.4.1, 3.4.2、3.4.3),但以下情况除外:

  • 对于使用非限定名称查找 (3.4.1) [..] 的查找部分,仅使用来自 找到模板定义上下文。

  • 对于使用关联命名空间 (3.4.2) 的查找部分,仅在模板定义中找到函数声明 找到上下文或模板实例化上下文。

可以肯定地说,非限定名称查找不会找到第二个重载,因为它只考虑模板定义上下文中的声明。

ADL 确实适用于此,但全局命名空间不会与参数包中的任何类型关联。我们有std::string, char const*, double, int。 [basic.lookup.argdep]/2 指定:

  • If T是一个基本类型,它关联的命名空间集和 班级都是空的。

  • If T是一个类类型(包括联合),其关联的类是: 班级本身;它所属的类别(如果有);和它的 直接和间接基类。其关联的命名空间是 其关联类是其成员的名称空间。此外, 如果T是一个类模板专业化,它关联的命名空间和 类还包括: 与关联的名称空间和类 为模板类型参数提供的模板参数的类型 (不包括模板模板参数);其中任意的命名空间 模板模板参数是成员;以及其中任何一个类别 用作模板模板参数的成员模板是成员。

所以无论是基本类型还是std::string包括全局命名空间作为关联命名空间。

长话短说...

...在 ADL 期间未搜索全局名称空间,并且未找到第二个重载。因此,函数模板的第一个重载是重载决议找到并随后选择的唯一重载。但未定义第一个重载,因此会发出链接器错误。


1) [temp.dep]/1:

在以下形式的表达式中:

      postfix-expression ( expression-listopt )

其中后缀表达式是id-表达式, the id-表达式表示一个附属名称 if

  • 中的任何表达式表达式列表是一个包扩展 (14.5.3),
  • [..]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可变参数模板的链接器错误 的相关文章

  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 386+ 处理器中的复位向量

    维基百科页面为重置向量 http en wikipedia org wiki Reset vector说 对于 386 处理器 复位时 CS 寄存器选择器部分的值为 F000h CS 寄存器基址部分的值为 FFFF0000h 复位时 IP
  • Django 和 SaaS。如何为每个 Django 站点使用单独的数据库?

    我正在使用 Django 创建一个 SaaS 项目 我决定使用django saas kit https github com zhaque django saas kit对于用户订阅和多帐户部分 理想情况下 我希望能够为每个用户创建一个新
  • C++ 和完全动态函数

    我有走弯路的问题 众所周知 Detours 只能在 5 个字节的空间之间移动 即 jmp 调用和 4 个字节的地址 因此 类 方法 中不可能有 hook 函数 您无法提供 this 指针 因为根本没有足够的空间 here s https s
  • Flask 应用程序无法在 heroku 服务器上启动

    我正在尝试使用 Heroku 部署 Flask 应用程序 这是简单的 API 与 foreman 一起在本地工作得很好 但在 heroku 上启动时出现错误 日志如下 这是我的应用程序代码 我知道它只是在一个块中查找 但我在将其拆分为文件时
  • VB.Net 损坏的字符串 - IDE 错误地将字符串解释为代码

    今天我打开了一个 Visual Basic 项目 其中有几行声明了一些字符串 其中包含逗号分隔的数据 我修改了其中一根字符串 重建并关闭了该项目 当我来测试时 出现了错误 当我查看代码时 我发现我修改的那一行之后的字符串也发生了变化 它们在
  • 使用 URLClassLoader 动态加载 JAR?

    我有一个程序需要能够在运行时动态加载 JAR 环顾四周后我相信它使用了 URLClassLoader 但我不确定如何让它工作 JAR openup jar 与程序位于同一目录中 Ideally我希望能够加载这个 JAR 而不必指定其中的每个
  • 在 Linux 上将 MSword 转换为 XML/HTML

    我需要将 MSWord 文件转换为 XML 或 HTML 同时保留文件的结构 主要是表格 我偶然发现了tika 它在从MSword文件 和任何文件 中提取文本方面非常强大 如下 curl www vit org downloads doc
  • TFS 2017 不构建 Fakes 目标

    我有一个安装了 VS 2017 Enterprise 的 TFS 2017 Update 2 本地服务器 我们的构建包含一个单元测试项目 其中包含一个 Fakes 程序集并在开发计算机上本地工作 在 TFS 上构建时 构建失败并显示 命名空
  • 动态插入 iframe 中的 jQuery .ready

    我们正在使用 jQuerythickbox http jquery com demo thickbox 当有人点击图片时动态显示 iframe 在此 iframe 中 我们使用galleria http devkick com lab ga
  • 更改总计和tax_total Woocommerce

    我使用自定义计算创建自定义结帐页面 我如何无法通过 Ajax 更改总计和tax total 或根据需要刷新页面 我为 ajax 请求创建自定义页面并设置此代码 ss new WC Session Handler ss gt set tax
  • 在 Hibernate 中使用惰性属性

    hibernate 中属性标签的惰性属性允许按照链接延迟加载属性 http docs jboss org hibernate orm 3 3 reference en US html mapping html mapping declara
  • 在 git 命令中的开关之前放置 - 和 -​- [重复]

    这个问题在这里已经有答案了 为什么我们把 在 git 中进行一些切换之前 在其他人之前 有没有任何经验法则可以帮助您记住使用哪一个 这实际上是一个通用的类 Unix 系统功能 在 GNU 应用程序中变得很常见 单破折号选项是 短 选项 双破
  • 使用 lapply 根据旧列创建新列

    我的数据如下 DF lt structure list No Adjusted Gross Income c 183454 241199 249506 NoR from 1 to 5000 c 1035373 4272260 1124098
  • 在 VS 2005 中增量构建

    我们在 VS 2005 中有 50 个项目的解决方案 如果没有任何改变 有什么方法可以进行增量构建吗 它有点像现在就这样做 但它执行每个项目的所有预构建和构建后事件 有什么办法可以预防吗 看看构建活动标签 请注意底部的下拉菜单 上面写着运行
  • 如何为 TEX 创建解析器?

    我正在寻求开发一个 TEX 解析器 现在的问题是没有上下文无关语法 也不可能有 因为它不是上下文无关语言 我听说它是 某种宏语言并且是建立在自己的基础上的 所以现在我需要指导这种宏语言具有什么样的语法以及如何在 C 中构建任何内容 我将编写
  • Spring Webflux 不明时间损失

    我们最近切换到 ExpediaGroups GraphQLlibrary https github com ExpediaGroup graphql kotlin它基于 Spring Webflux Since switching our
  • ics 文件 mime 类型

    我正在尝试将 ics 文件上传到我的网站 它是从 Mac OSX 上的 iCal 导出的 我认为 ics 文件的 mime 类型为text calendar 但由于某种原因 该文件的类型似乎是Application octet stream
  • 实体框架延迟加载的私有支持字段

    我正在使用启用了延迟加载的 Entity Framework 5 我有以下代码 private ICollection
  • 本地时区 鲁比

    需要创建一个 Rails 应用程序 我想在其中获取本地时区的时间 即如果位置是Delhi时区应该是IST如果位置是旧金山时区应该是PDT 如何在 ruby on Rails 中实现这一点 附 一行代码 可以根据位置自动设置时区 尝试这个Ti
  • 可变参数模板的链接器错误

    我有一个带有可变参数模板和辅助函数的程序 include