So I have couple of files that I want to compile together. One of them is stack.h with stack.cpp included.
The following is my header file:
#include<iostream>
#ifndef STACK_H
#define STACK_H
template <class ItemType>
class StackType
{
public:
//code
private:
//code
};
#include "stack.cpp"
#endif
The following is stack.cpp:
#include "stack.h"
#include <iostream>
using namespace std;
template<class ItemType>
StackType<ItemType>::StackType(){
top = -1;
MAX_ITEMS = 200;
}
//other codes
}
When I make it says that I am redefining the code in stack.cpp
The following is my 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
I don't see what the problem is.
You should not attempt to compile a stack.o
. This is template code that needs to be included in the client code and cannot be built. Just add the stack.cpp
dependency to the main.o
rule (assuming main.cpp includes stack.h
, and remove the stack.o
rule:
main.o: main.cpp stack.h stack.cpp
g++ $(CFLAGS) -c -o main.o main.cpp
You have a further problem, and that is that you include stack.h
in stack.cpp
, and vice versa. You should remove the #include stack.h
from stack.cpp
.
Since template code should not be compiled by itself, I suggest changing the suffix of stack.cpp
to something else, such as .icpp
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With