5

所以我有几个文件要一起编译。其中之一是包含 stack.cpp 的 stack.h。

以下是我的头文件:

#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

我不明白问题是什么。

4

2 回答 2

9

您不应尝试编译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.hin stack.cpp,反之亦然。您应该删除#include stack.hfrom stack.cpp

由于模板代码不应该自己编译,我建议将后缀更改stack.cpp为其他内容,例如.icpp.

于 2012-12-09T21:27:19.623 回答
2

分离接口和实现的想法,即使是模板,也是一个值得尊重的立场。我是否可以建议您不要将模板实现文件称为 .cpp 文件。Boost 在这种情况下使用 ipp,这对我来说似乎是合理的。

您在包含它时做了正确的事情,只是在编译它时做了错误的事情...... .cpp 表明您应该这样做。

于 2012-12-09T21:30:13.890 回答