gpt4 book ai didi

c++ - 模板类特化的C++内联或非内联声明

转载 作者:行者123 更新时间:2023-12-02 10:27:13 27 4
gpt4 key购买 nike

当应该内联专业时,我有些困惑。从this问题可以清楚地看到,必须内联每个特化名称,以避免重复的符号错误。但是,如果我想先声明特化,那会如何改变呢?
如果我们考虑这个例子:

template<typename T>
class myClass
{
public:
static void myPrint(T myVal);
}

#include "declarations.hpp"

//-----------------------------------------------

//declarations.hpp

template<typename T>
void myClass<T>::myPrint(T myVal)
{
cout << "printing unknown type " << myVal;
}

template <>
void myClass<int>::myPrint(int myVal); //inline here or in definition?

template <>
void myClass<float>::myPrint(float myVal); //inline here or in definition?

//-----------------------------------------------

//some_file_that_includes_myClass_header.cpp

template <>
void myClass<int>::myPrint(int myVal) //inline or no inline?
{
cout << "printing int " << myVal;
}

//-----------------------------------------------

//some_other_file_that_includes_myClass_header.cpp

template <>
void myClass<float>::myPrint(float myVal) //inline or no inline?
{
cout << "printing float " << myVal;
}
正确的方法是什么?为什么?

最佳答案

像其他问答中提到的那样,特化是它自己的实体。如果您这样做,则在 header 中声明特殊化,然后在格式良好的另一个(单个)TU中定义它们。包含该 header 的任何TU都会看到intfloat的特化只是声明。这样,它们的定义可以放在其他地方,就像非模板函数一样。
如果要使用仅 header 的库,在该库中内联定义了专用功能,则必须按照ODR的要求使用inline说明符。
在您似乎正在询问的意义上,这两种方法都不是“正确”的方法。每种都有自己的优点和缺点。内联定义函数有助于使库仅作为头文件。但是,如果功能很复杂,那么所有依赖关系都将拉入每个包含 header 的TU中。同样,更改专业将导致所有这些TU都重新编译。因此,有时也需要暂时取消实施。您需要根据具体情况进行判断。

关于c++ - 模板类特化的C++内联或非内联声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63867758/

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