For a school project, the class was asked to write a String class to mimic the STL string class.
I have all the code written, but the linker seems to be caught up on one of my operators.
There are three files, String.h, String.cpp, and test2.cpp
My Makefile looks like
CC=gcc
CXX=g++
CXXFLAGS+=-Wall -Wextra
LDLIBS+=-lstdc++
all:test2
test2:test2.o String.o
test2.o:test2.cpp String.h
String.o:String.cpp String.h
make outputs the following:
g++ -Wall -Wextra -c -o test2.o test2.cpp
g++ -Wall -Wextra -c -o String.o String.cpp
g++ test2.o String.o -lstdc++ -o test2
ld: duplicate symbol operator==(String const&, char const*)in String.o and test2.o
collect2: ld returned 1 exit status
make: *** [test2] Error 1
This is odd, since the only place I define operator == is in String.h:
#ifndef MY_STRING_H
#define MY_STRING_H
#include <ostream>
#include <istream>
class String {
//...
};
// ... operators ...
bool operator ==(const String& left, const char* right)
{ return left.compare_to(right)==0; }
bool operator ==(const char* left, const String& right)
{ return right.compare_to(left)==0; }
bool operator ==(const String& left, const String& right)
{ return left.compare_to(right)==0; }
// ... other comparison operators ...
#endif
test2.cpp only has a bare main method:
#include "String.h"
using namespace std;
int main() {
}
So, if I only define operator ==(const String&, const char*) in one place, why does it say I have a duplicate symbol?