C++ Primer(第四版p545)是采用这样的技术让模板定义和实现分离
Queue.h文件:
- #ifndef _QUEUE_H_
- #define _QUEUE_H_
- template class Queue;
- template
- class QueueItem
- {
- friend class Queue ;
- QueueItem( const Type& t ):value(t),next(0) {}
- Type value;
- QueueItem* next;
- };
- template
- class Queue
- {
- public:
- Queue():head(0),tail(0) {}
- Queue( const Queue& Q ):head(0),tail(0)
- {
- copy_item(Q);
- }
- ~Queue()
- {
- destroy();
- }
- Type& front()
- {
- return head->value;
- }
- const Type& front() const
- {
- return head->value;
- }
- void push( const Type& );
- void pop();
- bool empty() const
- {
- return head == 0;
- }
- void print();
- protected:
- private:
- QueueItem * head;
- QueueItem * tail;
- void copy_item( const Queue& );
- void destroy();
- };
- #include "Queue.cpp"
- #endif
Queue.cpp文件:
- #include "Queue.h"
- template
- void Queue ::destroy()
- {
- while ( !empty() )
- {
- pop();
- }
- }
- template
- void Queue ::pop()
- {
- QueueItem *ptr = head;
- head = head->next;
- delete ptr;
- }
- template
- void Queue ::push( const Type& t )
- {
- QueueItem *ptr = new QueueItem(t);
- if ( empty() )
- {
- head = tail = ptr;
- }
- else
- {
- tail->next = ptr;
- tail = tail->next;
- }
- }
- template
- void Queue ::copy_item( const Queue& Q )
- {
- QueueItem *ptr = Q.head;
- for ( ; ptr ; ptr++ )
- {
- push( ptr->value );
- }
- }
- template
- void Queue ::print()
- {
- while( !empty() )
- {
- cout < < head->value < < endl;
- }
- }
1. 在Queue.h文件的确写有#include "Queue.cpp"(这是对的)
2. 而建立的工程里面,并不把Queue.cpp包含进来(放在磁盘目录下,但别加入工程),也就是Queue.cpp并不直接参与编译链接,只有main()参加编译,
3. 在main()所在的文件中,#include "Queue.h"
由于1和3的效果,使分离的模板定义和实现合并到了main()所在的文件中
而由于Queue.cpp本身不直接编译(仅间接参与main()所在的文件的编译),所以也不会出现重定义错误
转载于:https://blog.51cto.com/sourberry/515251