[英]How to specialize a non-inline templated member function ? (for use in different translation units)
[英]Non-overloadable non-inline function definitions in different translation units
假设我有 2 个 TU,其中有 2 个带有外部链接的非内联函数定义,它们仅在返回类型上有所不同。
我的程序违反了哪些段落?
[basic.def.odr]/4说:
每个程序都应包含在该程序中被 odr 在丢弃语句之外使用的每个非内联函数或变量的一个定义; 无需诊断。
但
我相信您正在寻找: [basic.link]/9 :
两个相同([basic.pre])且在不同作用域中声明的名称应表示相同的变量、函数、类型、模板或命名空间,如果
- 两个名称都有外部或模块链接并在附加到同一模块的声明中声明,或者两个名称都有内部链接并在同一翻译单元中声明; 和
- 两个名称都引用同一命名空间的成员或同一类的成员,而不是通过继承; 和
- 当两个名称都表示函数或函数模板时,签名([defns.signature]、[defns.signature.templ])是相同的。
如果多个具有外部链接的同名声明将声明相同的实体,但它们附加到不同的模块,则程序格式错误; 不需要诊断。 [ 注意: using 声明、typedef 声明和别名声明不声明实体,而只是引入同义词。 类似地, using 指令不声明实体。 — 尾注 ]
在所有类型调整后(在此期间 typedef 被它们的定义替换),所有引用给定变量或函数的声明所指定的类型应该是相同的,除了数组对象的声明可以指定不同的数组类型缺少主数组绑定([dcl.array])。 在类型标识上违反此规则不需要诊断。
⟨函数⟩ 名称、参数类型列表([dcl.fct])和封闭命名空间(如果有)
返回类型不是签名的一部分,因此您违反了相同签名意味着相同实体的规则。
一般来说,标准中所有关于范围和名称查找的讨论都被打破了,直到戴维斯“我们不配拥有的英雄”赫林的工作通过。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.