2011-03-29 5 views
1

Следующий код компилирует идеально:Круговое Включение с шаблонами

// MyFile.h 

#ifndef MYFILE_H_INCLUDED 
#define MYFILE_H_INCLUDED 

template <typename Datatype> 
class MyClass 
{ 
    public: 
    void MyMethod(); 
} 

#include "MyFile.cpp" 

#endif 

// MyFile.cpp 

#ifndef MYFILE_CPP_INCLUDED 
#define MYFILE_CPP_INCLUDED 

#include "MyFile.h" 

template <typename Datatype> 
void MyClass<Datatype>::MyMethod() 
{ 
    // ... 
} 

#endif 

Определение других методов и функций может быть отделено от деклараций таким же образом. Есть ли недостатки в использовании этого подхода? Можно ли полагаться на это поведение?

+0

Что вы пытаетесь достичь здесь? – ltc

+0

@GMan Является ли '.tpp' стандартным расширением файла для такого рода вещей или может быть просто что-то, что не будет скомпилировано? – Maxpm

+0

Стандарт немного силен термином. Относительно распространенное было бы лучшим описанием. –

ответ

2

Если вы включили MyFile.tpp (я переименовал его из .cpp), то вам не нужно включать MyFile.h. #include В файле есть как раз копирование его содержимого в файл, в который он входит. Другое из этого, это обычная практика, чтобы организовать заголовки немного. (Хотя вам не нужно, включаемые охранники в MyFile.tpp, потому что она должна только когда-либо быть включена из другого заголовка непосредственно (как говорит GMan).)

5
  • Переименовать файл «MyFile.cpp» в «MyFile .tpp».
  • Удалить включаемые охранник из «MyFile.tpp»
  • Изменения включить в «MyFile.h», так что «MyFile.tpp»
  • Снимите включаемые внутри «MyFile.tpp»

Примечание: поскольку файл является файлом * .tpp (не * .cpp), он не должен включаться в другие операции системы сборки. Если вы добавили его вручную, удалите его.

Убедитесь, что единственное место, которое включает в себя <X> .tpp последняя строка в <X> .h

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