2012-02-26 1 views
0

Можно создать дубликат:
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?Рассматривается ли это явный шаблонный экземпляр класса C++?

Я студент информатики в каком-нибудь университете, и мы получили файлы для работы на для ш. И я не был уверен, как работает этот экземпляр.

короткий короткий код выглядел примерно так.

в 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 в файле заголовка работ.

+1

Нет, это не «явное создание шаблона». –

+1

Если вы назовете список ваших файлов. * ', Включите также «Список. *» (Заглавная буква в первой букве), а не «список. *». Таким образом, мы сможем создавать ваши проекты не только в Windows. –

+0

Cpp выглядит странно, я бы использовал hpp здесь – marcinj

ответ

2

#include просто вызывает текстовую замену, ничего больше, так что все содержимое list.cpp было дублировано в файле заголовка. Это не имеет ничего общего с «явным созданием шаблона».

list.cpp не включает заголовок, потому что иначе заголовок будет включать в себя рекурсивно.

+1

Он имеет все, что связано с созданием шаблона, но здесь нет * явного * экземпляра шаблона. –

+2

Это не приведет к бесконечной рекурсии, так как в файле .h есть определение часового. –

+0

Итак, это будет то же самое, что и запись всего содержимого list.cpp ниже реализации? Если да, то это будет квалифицироваться как неявное создание экземпляра, так как определение и объявление технически находятся в одном заголовочном файле? – wayfare

1

Ahhhh! Не включайте файлы .cpp!

Для написания класса шаблонов вы обычно ставите большую часть, если не всю реализацию, в файл .h, поэтому вам может даже не понадобиться list.cpp. Я не знаю, для чего list_given.cpp, поэтому я не могу сказать вам, нужен ли вам этот.

Когда вы создаете класс шаблона, это просто - шаблон, который сообщает компилятору, как создать класс. Таким образом, вам нужно будет включить list.h, содержащий все определение шаблона в любом файле, который использует класс списка.

Ваш пример не может быть явным экземпляром - я не знаю, зачем вам это нужно здесь. См., Например, this question, в частности, принятый ответ.

+0

Конечно, но для тех, кто просто учит C++, если у вас нет веских оснований, это хорошая идея придерживаться принятых практик. Просмотр файла заголовка включает исходный файл, выглядящий странно, и заставляет вас задаться вопросом, каковы его причины. – parkovski

+0

@pmr: Внедрение реализации в отдельный файл и '# include', поскольку оно довольно распространено. Однако предоставление этого файла расширением '.cpp' является ужасной идеей. –

+0

Если бы мы говорили о чем-то действительно тайном здесь, я бы согласился, но это очень распространенная вещь. – pmr

2

Нет, здесь ничего не создается, это просто решение проблемы, что полное определение шаблона 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) также включает в себя файл реализации и наших шаблонов работ.Альтернатива просто записывает определение в файл заголовка.

 Смежные вопросы

  • Нет связанных вопросов^_^