所以我想要一起编译几个文件。其中一个是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
以下是stack.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 :(得分:7)
您不应该尝试编译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.h
中加入了stack.cpp
,反之亦然。您应该从#include stack.h
删除stack.cpp
。
由于模板代码不应自行编译,我建议将stack.cpp
的后缀更改为其他内容,例如.icpp
。
答案 1 :(得分:2)
将界面和实现分开的想法,即使是模板,也是一个值得尊重的地方。我可能会建议您不要调用模板实现文件.cpp文件。 Boost在这种情况下使用ipp,这对我来说似乎是合理的。
你做了正确的事情,包括它,只是编译它的错误... .cpp表明你应该这样做。