为什么编译器会抱怨在多个.cpp文件中定义的非模板类,但是对于模板类很好,其定义在各种.cpp文件中重复(通过包含类的.inl文件),即使该类甚至在多个.cpp文件中显式实例化?
答案 0 :(得分:3)
非模板的情况是因为在那种情况下你的程序违反了一个定义规则,因此链接器(而不是编译器)会抱怨多个定义。
另一方面,对于模板,该语言指定必须这样做,链接器会排除要执行的操作。我不能100%确定是否应将显式模板实例化视为与非模板函数相同。
答案 1 :(得分:1)
模板函数是内联的,只要每个定义相同,就允许在多个编译单元中定义内联函数。
答案 2 :(得分:0)
所有编译器总是抱怨吗?我从未见过一个曾经做过的人 标准不允许:你被允许定义一个类或一个 模板在每个翻译单元中一次,只要全部 定义是相同的。实际上,您需要定义该类 在每个翻译单元中,以一种需要它的方式使用它 一个完整的类型。 C ++没有任何导出类的机制 其他翻译单位的定义。
你确定你没有把功能混淆。你不是 允许多次定义一个函数,除非它是内联函数。您 还是要在每个翻译单元中定义一个功能模板 使用它,并且相同的规则适用于函数模板和类 和类模板。
请注意,如果违反这些规则,请通过定义更多功能 比一个翻译单元,或通过类或的定义 模板不是标记相同的(在预处理之后,和 包括名称绑定),那么你有未定义的行为。编译器 (实际上链接器)可能会抱怨它,但它不是必需的:大多数 抱怨函数的多个定义,但我不知道 任何在类或模板定义不同时抱怨的 翻译单位。