根据https://eel.is/c++draft/temp.expl.spec#7 https://eel.is/c++draft/temp.expl.spec#7:
如果模板、成员模板或类模板的成员被显式特化,则在每个翻译单元中,该特化的声明应可从该特化的每次使用中到达,这将导致隐式实例化的发生。使用发生;无需诊断。
因此我想知道,以下程序是否格式错误,NDR?
// foo.h
template <typename T>
void foo();
// Specialization not declared in the header!
// foo.cpp
#include "foo.h"
template <>
void foo<int>()
{
// ...
}
// main.cpp
#include "foo.h"
int main()
{
foo<int>();
}
看起来这个确切的案例包含在标准委员会的“已关闭问题列表”中,您可以阅读here https://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#2138,很难得到比这更权威的了。
TL;DR:
理由(2016 年 3 月):
如分析中所述,目的是使示例格式错误,无需诊断。
请注意,您可以找到很多与此非常相似的问题。我发现this one https://stackoverflow.com/questions/61150890/calling-function-templates-specialized-in-another-translation-unit例如,其中一位答复者引用了工作组的讨论。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)