template <class T>
class Node{
T *object;
public:
Node();
Node(T *);
Node<T> * next;
Node<T> * prev;
};
Шаблоны С++
Код:
Код:
template <class T>
Node<T>::Node(){
object = new T();
}
template <class T>
Node<T>::Node(T * node){
object = new T();
object = node;
this->next = 0;
this->prev = 0;
}
Node<T>::Node(){
object = new T();
}
template <class T>
Node<T>::Node(T * node){
object = new T();
object = node;
this->next = 0;
this->prev = 0;
}
При вызове конструктора :
Код:
Session *session = new Session("PREDMET1",4);
Node<Session> *node = new Node<Session>(session);
Node<Session> *node = new Node<Session>(session);
Вылетает ошибка
Код:
error LNK2001: unresolved external symbol "public: __thiscall Node<class Session>::Node<class Session>(class Session *)" (??0?$Node@VSession@@@@QAE@PAVSession@@@Z)
Debug/Stud_List.exe : fatal error LNK1120: 1 unresolved externals
Debug/Stud_List.exe : fatal error LNK1120: 1 unresolved externals
Что то я не пойму, где ошибку сделал, вроде все правильно ...
весь этот ко должен находиться в оном файле. Это так?
Цитата: Ordos
весь этот ко должен находиться в оном файле. Это так?
нет, не так 0_о
в смысле не совсем весь, а только описание шаблона.
Код:
template <class T>
class Node{
T *object;
public:
Node();
Node(T *);
Node<T> * next;
Node<T> * prev;
};
template <class T>
Node<T>::Node(){
object = new T();
}
template <class T>
Node<T>::Node(T * node){
object = new T();
object = node;
this->next = 0;
this->prev = 0;
}
class Node{
T *object;
public:
Node();
Node(T *);
Node<T> * next;
Node<T> * prev;
};
template <class T>
Node<T>::Node(){
object = new T();
}
template <class T>
Node<T>::Node(T * node){
object = new T();
object = node;
this->next = 0;
this->prev = 0;
}
то есть объявление класса и его реализация д.б. в 1 файле или еще что то ?
Обычные классы в С++ разделяют на хедер файл и спп файл.
С шаблонами так нельзя делать.
Шаблон целиком должен каходиться в одном файле.
Спсибо, буду знать )
Код:
template <class T>
class mList{
Node<T> * root;
Node<T> * curent;
public:
mList<T> ();
mList<T>(Node<T>*);
void Add(Node<T> *n);
void Delete(Node<T> *n);
void DeleteRoot();
void DeleteLast(Node<T> *n);
void print();
};
class mList{
Node<T> * root;
Node<T> * curent;
public:
mList<T> ();
mList<T>(Node<T>*);
void Add(Node<T> *n);
void Delete(Node<T> *n);
void DeleteRoot();
void DeleteLast(Node<T> *n);
void print();
};
Вызываю конструктор так:
Код:
typedef Node<Session> sesNode;
Session *session = new Session("PREDMET1",4);
sesNode *node = new sesNode(session);
mList<sesNode> *list = new mList<sesNode>(node);
Session *session = new Session("PREDMET1",4);
sesNode *node = new sesNode(session);
mList<sesNode> *list = new mList<sesNode>(node);
ошибка:
error C2664: '__thiscall mList<class Node<class Session> >::mList<class Node<class Session> >(class Node<class Node<class Session> > *)' : cannot convert parameter 1 from 'class Node<class Session> *' to 'class Node<class Node<class Session> > *'
mList<Session> *list = new mList<Session>(node);
Чаще всего описывают шаблонный класс в .h файле, его реализацию в .hxx, а инстанциируют (о слово какое :) ) объекты в .cxx файлах.
Вот так вот.
Цитата: vAC
mList<Session> *list = new mList<Session>(node);
Да, точно ))
Цитата: Ordos
Короче всё, что касается шаблона (описание шаблона и его реализация).
Обычные классы в С++ разделяют на хедер файл и спп файл.
С шаблонами так нельзя делать.
Шаблон целиком должен каходиться в одном файле.
Обычные классы в С++ разделяют на хедер файл и спп файл.
С шаблонами так нельзя делать.
Шаблон целиком должен каходиться в одном файле.
На самом деле, так можно делать при некоторых огранчениях:
Если в некотором .cpp есть обощенная реализация, то в этом же .cpp можно использовать любые шаблонные параметры.
Также можно делать специализацию шаблона.
В других же модулях можно использовать шаблон либо с теми же шаблонными параметрами, что использовались в первом .cpp, либо любую специализацию из него. Однако, в этом модуле можно определить любую другую специализацию и использовать ее в любом другом модуле (разумеется кроме .cpp, где сделана обобщенная реализация).
Все это следует из простой вещи: обобщенную реализацию нельзя скомпилировать.
Код:
template<int M,int L,int T>
class Physical {
double value_;
public:
double value() { return value_; }
Physical(double v) : value_(v) {}
Physical(const Physical& rhs) : value_(rhs.value_) {}
};
template<int m1, int l1, int t1, int m2, int l2, int t2>
Physical<m1 + m2, l1 + l2, t1 + t2> operator*(Physical<m1, l1, t1> lhs, Physical<m2, l2, t2> rhs)
{
return lhs.value() * rhs.value();
}
void main()
{
Physical<0,1,0> length(2.0); // 2[m]
Physical<0,0,-1> inv_time(0.1); // 0.1[1/sec] (10[sec])
std::cout << (length*inv_time).value() << " [";
std::cout << typeid(length*inv_time).name() << "]\n";
}
class Physical {
double value_;
public:
double value() { return value_; }
Physical(double v) : value_(v) {}
Physical(const Physical& rhs) : value_(rhs.value_) {}
};
template<int m1, int l1, int t1, int m2, int l2, int t2>
Physical<m1 + m2, l1 + l2, t1 + t2> operator*(Physical<m1, l1, t1> lhs, Physical<m2, l2, t2> rhs)
{
return lhs.value() * rhs.value();
}
void main()
{
Physical<0,1,0> length(2.0); // 2[m]
Physical<0,0,-1> inv_time(0.1); // 0.1[1/sec] (10[sec])
std::cout << (length*inv_time).value() << " [";
std::cout << typeid(length*inv_time).name() << "]\n";
}
где параметры шаблона обозначают степени единиц измерения (масса, длина, время).