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