Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.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++_Templates_Compiler Construction_Linker - Fatal编程技术网

C++ 非模板类与模板类的多个定义

C++ 非模板类与模板类的多个定义,c++,templates,compiler-construction,linker,C++,Templates,Compiler Construction,Linker,为什么编译器抱怨在多个.cpp文件中定义了一个非模板类,但对于一个模板类却没有问题,因为该模板类的定义在不同的.cpp文件中是重复的(通过包含该类的.inl文件),即使该类在多个.cpp文件中显式实例化?非模板情况是因为在这种情况下,您的程序违反了一个定义规则,因此链接器(而不是编译器)会抱怨多个定义 另一方面,对于模板,该语言指定这必须起作用,并且链接器会安排要做的事情。但是,我不能100%确定是否应该将显式模板实例化视为非模板函数。所有编译器都会抱怨吗?我从没见过这样的,而且 标准不允许这样

为什么编译器抱怨在多个.cpp文件中定义了一个非模板类,但对于一个模板类却没有问题,因为该模板类的定义在不同的.cpp文件中是重复的(通过包含该类的.inl文件),即使该类在多个.cpp文件中显式实例化?

非模板情况是因为在这种情况下,您的程序违反了一个定义规则,因此链接器(而不是编译器)会抱怨多个定义


另一方面,对于模板,该语言指定这必须起作用,并且链接器会安排要做的事情。但是,我不能100%确定是否应该将显式模板实例化视为非模板函数。

所有编译器都会抱怨吗?我从没见过这样的,而且 标准不允许这样做:您可以定义一个类或 模板在每个翻译单元中一次,只要所有 定义是相同的。事实上,您需要定义类 在每一个翻译单位中,如果使用它的方式要求 完整的类型。C++没有导出类的机制 其他翻译单位的定义

您确定没有将类与函数混淆吗。你不是 允许多次定义函数,除非它是内联函数。你 还必须在每个翻译单元中定义一个函数模板 使用它,同样的规则适用于函数模板和类 和类模板

请注意,如果您违反了这些规则,请通过在更多 多个翻译单元,或根据类或 模板在标记方面不完全相同(预处理后,以及 包括名称绑定),则有未定义的行为。编译程序 (实际上是链接器)可能会抱怨,但这不是必需的:大多数 抱怨函数的多个定义,但我不知道 当类或模板定义在
翻译单元。

模板函数是内联的,只要每个定义相同,就允许在多个编译单元中定义内联函数。

在多个翻译单元中显式实例化模板就像在每个TU中隐式实例化一样处理。我不确定是否理解。他询问了有关类的问题,您可以(而且必须)拥有一个类的多个定义。不允许在多个翻译单元中定义非模板类非内联成员函数。@bames53在多个翻译单元中定义非内联函数(成员与否)是未定义的行为。这可能是他的意思,但他问的是定义一个类,而不是一个函数。这是否意味着,反过来,用
inline
标记模板类(或只是模板函数)的函数是完全没有意义的,因为它已经被限定为inline?@desmondhum,我想是的,但我通常在类声明中定义模板函数,所以我不确定。在类定义中定义的所有函数都是隐式内联的,但我不相信模板函数通常是内联的。模板函数也有一个类似的规则,允许在多个翻译单元中定义它们。也许你应该发布编译器的抱怨和生成它的代码,这样你就清楚你在问什么了。