开发者

Odd duplicate symbols error

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(r开发者_高级运维ight)==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?


You provided the definitions of the operators in the header file which gets included by both String.cpp and test2.cpp.
You should move the definitions into one source file and only provide declarations in the header file.

// in String.h:
bool operator==(const String& left, const char* right);

// in String.cpp:
bool operator ==(const String& left, const char* right) {
    return left.compare_to(right)==0; 
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜