gpt4 book ai didi

c++ - 显式实例化源文件中的定义时, header 中是否需要显式模板实例化声明?

转载 作者:行者123 更新时间:2023-11-28 01:32:04 26 4
gpt4 key购买 nike

this question ,接受的答案涉及头文件中的模板函数声明,该头文件在源文件中有其定义。为了使这个模板函数也可以在其他翻译单元中使用,在源文件中为每个“允许的”用法进行了显式模板实例化。到目前为止,这在我看来是标准做法。

然而,答案还建议在头文件中放置相应的显式模板实例化声明。我以前从未见过这种做法,想知道标准是否要求这样做。

这是一个小例子:

啊啊

struct A
{
template<class T>
void g(T t);
};

A.cpp

#include "A.h"

template<class T>
void A::g(T t)
{ /* ... */ }

template void A::g(int); // Explicit instantiation of the definition.

main.cpp

#include "A.h"

int main()
{
A a;
a.g(0);
}

wording in the standard我不清楚是否还需要显式实例化声明。这似乎主要涉及“定义从未被显式实例化,A.cpp 中的隐式实例化不能保证被保留”的情况(未描述),但我希望得到澄清。

最佳答案

Are explicit template instantiation declarations required in the header when explicitly instantiating the definitions in the source file?

没有。规则是,来自 [temp]/10 ,强调我的:

A function template, member function of a class template, variable template, or static data member of a class template shall be defined in every translation unit in which it is implicitly instantiated unless the corresponding specialization is explicitly instantiated in some translation unit; no diagnostic is required.

在您的示例中,A::g<int>main.cpp 中隐式实例化但它在“某些翻译单元”(A.cpp)中明确实例化。程序没问题。

关于c++ - 显式实例化源文件中的定义时, header 中是否需要显式模板实例化声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51087060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com