这被认为是显式C++模板类实例化吗

Is this considered explicit C++ template class Instantiation?

本文关键字:实例化 C++ 认为是      更新时间:2023-10-16

可能重复:
为什么模板只能在头文件中实现
为什么模板类的实现和声明应该在同一个头文件中?

我是某所大学的计算机科学专业学生,我们得到了为hw工作的文件。我不确定这种实例化是如何工作的。

长代码短代码看起来像这样。

在List.h 中

#ifndef _LIST_H_
#define _LIST_H_
#include <iterator>
#include <ostream>
template <class T>
class List
/* implementation below but not relevant to this post */
.
.
.
.

下面文件的最后几行。

#include "list.cpp"
#include "list_given.cpp"
#endif

List.cpp不包括List.h

我不明白在头文件中包含List.cpp是如何工作的。

#include只会导致文本替换,而不会导致其他替换,所以就好像list.cpp的整个内容在头文件中重复了一样。这与"显式模板实例化"无关。

list.cpp不包括报头,因为否则报头将递归地包括自身。

不,这里没有实例化任何东西,这只是解决了C++模板的完整定义必须在实例化模板的每个翻译单元中可见的问题,并且一些程序员希望将定义和声明分开。如果这真的值得的话,是不被普遍接受的。有些人还喜欢使用不同的文件结尾来表示要包含在头中的实现文件(例如tccicc)。

它是如何工作的:

// Foo.h
#ifndef FOO_HEADER_INCLUDED
#define FOO_HEADER_INCLUDED
template<T>
struct Foo {
  void bar();
};
#include "Foo.cpp"
#endif // header guard
// Foo.cpp
// NO HEADER GUARD, NEVER INCLUDE DIRECTLY
// actually this could have an include guard and still work
template<typename T>
void Foo<T>::bar() { /* smart code */ }

现在,每个用户(包括Foo.h的用户)也包括实现文件和我们的模板工作。另一种选择是只需在头文件中写入定义即可。

啊!不要包含.cpp文件!

对于编写模板类,通常将大部分(如果不是全部的话)实现放在.h文件中,因此您甚至可能不需要list.cpp。我不知道list_given.cpp是干什么的,所以我不能告诉你是否需要那个。

当你创建一个模板类时,它只是一个模板,告诉编译器如何创建一个类。因此,您需要在任何使用列表类的文件中包含包含模板的整个定义的list.h

您的示例不符合显式实例化的条件——我不知道您为什么需要它。请参阅这个问题,特别是公认的答案,以获取一个例子。