为模板类创建一个makefile

时间:2012-12-09 21:25:30

标签: c++ templates makefile

所以我想要一起编译几个文件。其中一个是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

我不明白这是什么问题。

2 个答案:

答案 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表明你应该这样做。