.cpp 文件中的模板专业化 + .h 文件中的主模板声明

2024-04-15

根据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(使用前将#替换为@)

.cpp 文件中的模板专业化 + .h 文件中的主模板声明 的相关文章

随机推荐