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

时间:2012-02-26 19:40:04

标签: c++ templates header-files

  

可能重复:
  Why can templates only be implemented in the header file?
  Why should the implementation and the declaration of a template class be in the same header file?

我是某大学的计算机科学专业的学生,​​我们获得了为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。

3 个答案:

答案 0 :(得分:2)

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

list.cpp不包括标题,否则标题会递归地包含它自己。

答案 1 :(得分:2)

不,这里没有实例化,这只是一个问题的解决方案,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的用户)也包括 实现文件和我们的模板工作。另一种方法是 只需在头文件中写下定义。

答案 2 :(得分:1)

AHHHH!不要包含.cpp个文件!

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

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

您的示例不符合显式实例化的要求 - 我不知道您为什么需要它。有关此示例,请参阅this question,特别是已接受的答案。