Использование template
#ifndef TSTACK_
#define TSTACK_
template <class T>
class TStack
{
T m_Value;
public:
T GetValue( void );
void SetValue( T value );
};
template<class T>
T TStack<T>::GetValue( void )
{
return m_Value;
}
template<class T> void TStack<T>::SetValue( T value )
{
m_Value = value;
}
#endif
Файл main.cpp :
#include "stdafx.h"
#include "Tstack.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
TStack<float> t;
float x;
t.SetValue( 5.3 );
x = t.GetValue();
cout << x << endl;
}
Как видно выше обьявления класа и его реализация находятся в одном файле Tstack.h! При попытке поместить реализацию в отдельный файл Tstack.cpp получилось два файла.
Tstack.h :
#ifndef TSTACK_
#define TSTACK_
template <class T>
class TStack
{
T m_Value;
public:
T GetValue( void );
void SetValue( T value );
};
#endif
Tstack.cpp :
#include "stdafx.h"
#include "Tstack.h"
template<class T>
T TStack<T>::GetValue( void )
{
return m_Value;
}
template<class T> void TStack<T>::SetValue( T value )
{
m_Value = value;
}
При попитке откомпилировать даный код компилятор выдает ошибку при линковке! Подозреваю что это связано с особеностю обьявления template!
Что вы думаете по этому поводу?
Шаблоны надо реализовывать там же где они описанны, так как окончательно шаблонный класс определяется только в момент инициализации его типом. Тогда же и создаются его методы по шаблонной реализации.
кхкх... и дабы на будущее человек знал - [COLOR=Red]ОФОРМЛЯЙТЕ КОД СПЕЦИАЛЬНЫМИ ТЕГАМИ![/COLOR] пожалуйста :)
Значит, надо либо делать #include "шаблон.hpp", чтобы компилятор мог использовать текст шаблона, либо всё писать в .h файле. Правильным является второй способ.