首页 / 知识
关于linux:C函数模板专业化的可见性
2023-04-15 03:31:00

Visibility of template specialization of C++ function假设我有 如果我现在从其他代码(也许也从另一个库)调用 我现在遇到这个问题,类和函数都存在于两个应用程序使用的库中。一个应用程序正确使用专业化,而另一个应用程序使用通用形式(稍后会导致运行时问题)。为什么会有所不同?可能与链接器选项等有关吗?这是在Linux上,带有g 4.1.2。 对在调用点不可见的模板进行专门化处理是错误的。不幸的是,编译器不需要诊断此错误,然后可以对您的代码执行他们喜欢的操作(标准的说法是"格式错误,无需诊断")。 从技术上讲,您需要在头文件中定义特殊化,但是几乎每个编译器都会按照您的期望进行处理:这在C 11中已通过新的"外部模板"功能进行了修复:
这明确声明了特定专业在其他地方定义。许多编译器已经支持此功能,有些支持,有些不支持 您是否已将带有参数的原型添加到头文件中? 我的意思是文件A.h中有某处
如果不是,那可能就是原因。 我在gcc4上遇到了同样的问题,这是我如何解决的。这比我之前的评论使我相信的解决方案更简单。先前的帖子想法是正确的,但是它们的语法对我不起作用。
根据规范,切勿在 另一方面,一旦实例化了功能模板,编译器就可以看到不再是模板的功能。 GCC可以在不同的编译器单元之间重用此定义,因为该标准规定,对于给定的一组类型参数[temp.spec],每个模板只能实例化一次。但是,由于未导出模板,因此应将其限制为编译单元。 我相信GCC在跨编译单元共享其实例化模板列表时可能会暴露一个错误。通常,这是一个合理的优化,但是应该考虑功能专业化,而这似乎并不能正确地完成。 正如Anthony Williams所说, fileA.h:
fileA.C:
在Microsoft C中,我对内联函数进行了实验。我想知道如果我在其他来源中定义了不兼容版本的函数会发生什么。根据使用的是Debug版本还是Release版本,我得到不同的结果。在Debug中,编译器拒绝内联任何内容,并且无论源代码中的作用域如何,链接器都在链接相同版本的函数。在Release中,编译器内联了当时定义的任何版本,并且您获得了该函数的不同版本。 在任何情况下都没有任何警告。我有点怀疑,这就是我进行实验的原因。 我假设模板函数的行为与其他编译器相同。 @ [安东尼·威廉姆斯], 您确定不会将
布兰登:这就是我的想法-不应调用专用功能。对于我提到的第二个应用程序,这是正确的。但是,即使未在头文件中声明特殊化,第一个应用程序也显然会调用特殊化形式! 我主要在这里寻求启发:-),因为第一个应用程序是单元测试,但是不幸的是,这个错误没有出现在测试中,而是出现在真实的应用程序中... (PS:我已经通过在标头中声明特殊性来修复此特定的错误;但是还有哪些其他类似的错误可能仍被隐藏?) 除非在头文件中还列出了专用模板功能,否则其他应用程序将不了解专用版本。解决方案是也将 |
最新内容
相关内容
python声明变量
python声明变量,培训,代码,变量,赋值,字符串,类型,语句,函数,上面,声明,首先,在Python解释器中输入如下内容:>>>a=5上面代码没有生成任何输出,只python声明变量类型
python声明变量类型,培训,代码,基础,变量,赋值,类型,字符串,语句,函数,上面,对于没有编程基础的读者,可以先不编写真正的Python程序,而是先打开python变量不需要声明吗
python变量不需要声明吗,培训,数字,变量,代码,合法,声明,类型,整数,字符串,布尔,Python中常见的数据类型有字符串,整形,列表,元组,字典等。在Pythpython怎么声明变量
python怎么声明变量,培训,通用,一致,数字,变量,声明,字符串,引号,方式,类型,python声明变量:1、变量声明声明变量的时候,直接使用例如a=1这样的python变量使用前需声明嘛
python变量使用前需声明嘛,培训,代码,基础,变量,赋值,字符串,类型,语句,函数,上面,Python使用等号(=)作为赋值运算符,例如a=20就是一条赋值语python需要声明类型吗
python需要声明类型吗,数据,培训,中心,类型,声明,语言,变量,内存空间,内存,整数,在其他语言中,例如C/C++语言中在存储一个数据之前,都需要在内python如何声明函数
python如何声明函数,培训,函数,较大,合法,代码,画线,工具,定义,单词,参数,python函数的定义定义函数,也就是创建一个函数,可以理解为创建一个具python定义变量需要声明类型吗
python定义变量需要声明类型吗,培训,数字,变量,合法,代码,声明,类型,整数,布尔,字符串,在Python语言中,声明变量的同时需要为其赋值,毕竟不代表pythonpython的声明变量类型
pythonpython的声明变量类型,培训,数字,变量,名字,代码,概念,合法,声明,类型,整数,变量(variable)是Python语言中一个非常重要的概念。变量的python需要声明类型吗
python需要声明类型吗,数据,培训,代码,中心,类型,声明,语言,变量,内存空间,内存,python不用去声明变量的类型,是由于其“若类型”的语言特性决关于c#:如何声明内联谓词?
关于c#:如何声明内联谓词?,关于c#:如何声明内联谓词?,对象,列表,通用,字段,How do you declare a Predicate Delegate inline?我正在使用C#关于c ++:带有GCC的预编译头文件
关于c ++:带有GCC的预编译头文件,关于c ++:带有GCC的预编译头文件,预编译头文件,尝试,我也,如何设置,Precompiled headers with GCC任