Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板类专门化的内联或非内联声明_C++_Templates_Inline_Template Specialization - Fatal编程技术网

C++ C++;模板类专门化的内联或非内联声明

C++ C++;模板类专门化的内联或非内联声明,c++,templates,inline,template-specialization,C++,Templates,Inline,Template Specialization,当一个人应该内联专业时,我有点困惑。从这个问题可以清楚地看出,每个专门化都必须内联,以避免重复的符号错误。但若我想先有一个专门化的声明,那个会怎样改变呢 如果我们考虑这个例子: template<typename T> class myClass { public: static void myPrint(T myVal); } #include "declarations.hpp" //--------------------------------

当一个人应该内联专业时,我有点困惑。从这个问题可以清楚地看出,每个专门化都必须内联,以避免重复的符号错误。但若我想先有一个专门化的声明,那个会怎样改变呢

如果我们考虑这个例子:

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;
}
模板
类myClass
{
公众:
静态无效myPrint(T myVal);
}
#包括“declarations.hpp”
//-----------------------------------------------
//声明.hpp
模板
void myClass::myPrint(T myVal)
{
库特
正确的方法是什么?为什么

这些专门化也需要内联,原因与模板化版本相同

如果这些符号没有内联,那么最终将在任何编译单元(包括该头)中得到这些符号的多个定义

比如说

template <>
inline void myClass<int>::myPrint(int myVal) {
    cout << "printing int " << myVal;
}
模板
内联void myClass::myPrint(int myVal){
库特
正确的方法是什么?为什么

这些专门化也需要内联,原因与模板化版本相同

如果这些符号没有内联,那么最终将在任何编译单元(包括该头)中得到这些符号的多个定义

比如说

template <>
inline void myClass<int>::myPrint(int myVal) {
    cout << "printing int " << myVal;
}
模板
内联void myClass::myPrint(int myVal){

cout像其他问答提到的那样,专门化是它自己的实体。如果您这样做,请在标题中声明专门化,然后在另一个标题中定义它们(单个)TU,这是格式良好的。任何包含该头的TU都会看到
int
float
的专门化只是声明。因此,它们的定义可以放在其他地方,就像非模板函数一样

如果您想要一个只有头的库,其中专门的函数是内联定义的,那么您必须按照ODR的要求使用
inline
说明符


两种方法都不是“正确的”从某种意义上说,你似乎在问。每一个都有自己的优点和缺点。定义内联函数有助于使库只成为标题。但是,如果函数很复杂,那么它们的所有依赖项都会被拉到包含标题的每个TU中。此外,更改专门化会导致所有这些TU都被重新定义-编译。因此,有时将实现隐藏起来也是有好处的。您需要根据具体情况进行判断。

像其他问答提到的那样,专门化是它自己的实体。如果您这样做,请在标题中声明专门化,然后在另一个标题中定义它们(单个)TU,这是格式良好的。任何包含该头的TU都会看到
int
float
的专门化只是声明。因此,它们的定义可以放在其他地方,就像非模板函数一样

如果您想要一个只有头的库,其中专门的函数是内联定义的,那么您必须按照ODR的要求使用
inline
说明符


两种方法都不是“正确的”从某种意义上说,你似乎在问。每一个都有自己的优点和缺点。定义内联函数有助于使库只成为标题。但是,如果函数很复杂,那么它们的所有依赖项都会被拉到包含标题的每个TU中。此外,更改专门化会导致所有这些TU都被重新定义-编译。因此有时也需要将实现隐藏起来。您需要根据具体情况进行判断。

在这种情况下,我应该将内联关键字放在哪里?声明、定义或两者都放在哪里?您需要将其放在函数返回类型之前的定义中。如何将内联说明符放在Source file help?编译器不需要能够看到定义吗?这将只定义包含\u myClass\u header.cpp的某些\u其他\u文件的方法。在这种情况下,我应该将inline关键字放在哪里?声明、定义还是两者都放?您需要将其放在函数返回类型之前的definitoin处。如何放置源文件帮助中某个方法的内联说明符?编译器不需要能够看到定义吗?这将只为包含\u myClass\u header.cpp的某些\u其他\u文件\u定义方法。因此,在这种情况下,内联仅在头中有定义时才重要,因此,在我描述的情况下,内联不是必需的在问题中?@GregorSattel-在您描述的情况下不需要它。
inline
主要是一个链接说明符。当一个函数的多个定义可能最终出现在一个程序中(例如在头中定义的函数)时,需要它。它告诉编译器/链接器,您承诺所有这些定义实际上都是相同的,因此任何一个都可能被选为“定义”。如果您改为声明/定义函数,那么已经只有一个定义,因此添加内联说明符没有意义。因此,在这种情况下,内联仅在标题中有定义时才重要,因此这意味着在我在问题中描述的情况下,内联是不必要的?@GregorSattel-在这种情况下不需要内联u描述。
inline
主要是一个链接说明符。当一个函数的多个定义可能最终出现在一个程序中(例如在头中定义的函数)时,需要它。它告诉编译器/链接器,您承诺所有这些定义实际上是相同的,因此任何一个都可以被选为“定义”。如果您改为声明/定义函数,那么已经只有一个定义,因此添加内联说明符没有意义。