gpt4 book ai didi

c++ - 为什么内联模板特化有帮助,我应该这样做吗?

转载 作者:太空宇宙 更新时间:2023-11-03 10:32:46 24 4
gpt4 key购买 nike

模板特化的问题在于它们被视为普通函数,因为模板参数不再在任何地方使用。

因此,如果将以下代码放在头文件中,它首先会起作用。

template <typename foo>
void f(foo p)
{
std::cout << "f one" << std::endl;
}

template <>
void f<int>(int p)
{
std::cout << "f two" << std::endl;
}

但是如果标题包含在两个文件中,这将停止工作。在这种情况下,我得到的错误(使用 VS2010)是:

templateordering.obj : error LNK2005: "void __cdecl f<int>(int)" (??$f@H@@YAXH@Z) already defined in othertu.obj

这可以通过使用许多其他问题中提到的 inline 关键字来解决。

template <>
inline void f<int>(int p)
{
std::cout << "f two" << std::endl;
}

现在这对我提出了两个问题:

  1. 还有其他方法吗?将专用函数放在源文件中似乎不起作用。可能是因为我需要在 header 中进行某种声明。
  2. 内联实际上做了什么?不应该使用 inline 似乎是整个互联网上的一个普遍经验法则,因为编译器“可能会在任何情况下以他喜欢的方式内联函数”。因此,如果编译器可能不会内联我声明为“内联”的函数,为什么会这样呢?

最佳答案

Is there any other way to do this? Putting the specialized function in the source file doesn't seem to work. Probably because I would need some sort of declaration in the header.

您需要在 header 中声明 特化,就像任何其他函数一样。是在标题中还是在(恰好一个)源文件中内联定义它取决于您;再次,就像任何其他功能一样。如您所说,如果您在 header 中定义它,则必须将其声明为 inline

What does inline actually do?

通常,一个定义规则 要求函数在程序的一个翻译单元中定义。实际上,这意味着您不能在 header 中定义函数,因为 header 旨在包含在多个翻译单元中。

但是,有时您想要或需要在 header 中定义函数 - 例如,某些编译器只有在看到定义时才能内联函数调用。 inline 关键字放宽了规则,因此您可以在多个翻译单元中定义函数,只要所有定义都相同即可。

关于c++ - 为什么内联模板特化有帮助,我应该这样做吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11758695/

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