2012-12-09 48 views
3

所以我有几个,我想编译的文件一起其中一个stack.h与stack.cpp 这就是我的头文件:制作生成文件的模板类

#include<iostream> 
#ifndef STACK_H 
#define STACK_H 
template <class ItemType> 
class StackType 
{ 
public: 
    //code 


private: 
    //code 
}; 
#include "stack.cpp" 
#endif 

的话,我已经堆的.cpp

#include "stack.h" 
#include <iostream> 
using namespace std; 

template<class ItemType> 
StackType<ItemType>::StackType(){ 
    top = -1; 
    MAX_ITEMS = 200; 
} 

//other codes 
} 

但它说,我重新定义代码stack.cpp

这就是我的makefile

main.o: main.cpp stack.h 
    g++ $(CFLAGS) -c -o main.o main.cpp 
stack.o: stack.cpp stack.h 
    g++ $(CFLAGS) -c -o stack.o stack.cpp 

我看不出问题所在。

+0

什么说你正在重新定义代码?请发布*确切*错误消息。 –

回答

6

您不应该尝试编译stack.o。这是需要包含在客户端代码中的模板代码,无法构建。只需添加stack.cpp依赖于main.o规则(假设main.cpp中包括stack.h,并删除stack.o规则:

main.o: main.cpp stack.h stack.cpp 
    g++ $(CFLAGS) -c -o main.o main.cpp 

你有另外一个问题,那就是您在stack.cppstack.h,反之亦然。你应该从stack.cpp删除#include stack.h

由于模板代码不应该由自己来编,我建议改变stack.cpp别的东西的后缀,如.icpp

0

即使对于模板,分离您的接口和实现的想法是一个值得尊敬的位置。我可能会建议你不要调用模板实现文件.cpp文件。 Boost在这种情况下使用ipp,这对我来说似乎是合理的。

你做了正确的事情包括它,只是在编译它错误的东西......哪些.cpp会表明你应该做。

相关问题