这被认为是显式C++模板类实例化吗
Is this considered explicit C++ template class Instantiation?
可能重复:
为什么模板只能在头文件中实现
为什么模板类的实现和声明应该在同一个头文件中?
我是某所大学的计算机科学专业学生,我们得到了为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++模板的完整定义必须在实例化模板的每个翻译单元中可见的问题,并且一些程序员希望将定义和声明分开。如果这真的值得的话,是不被普遍接受的。有些人还喜欢使用不同的文件结尾来表示要包含在头中的实现文件(例如tcc
、icc
)。
它是如何工作的:
// 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
。
您的示例不符合显式实例化的条件——我不知道您为什么需要它。请参阅这个问题,特别是公认的答案,以获取一个例子。
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 受约束的成员函数和显式模板实例化
- 对显式实例化的模板函数的未定义引用
- [temp.variadic]中关于包扩展实例化的措辞