对于学校项目,该课程被要求编写String
课程来模仿STL string
课程。
我已经编写了所有代码,但链接器似乎被我的一个操作员所接受。
有三个文件,String.h
,String.cpp
和test2.cpp
我的Makefile
看起来像
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
输出以下内容:
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
这很奇怪,因为我定义operator ==
的唯一地方是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
只有一个main
方法:
#include "String.h"
using namespace std;
int main() {
}
所以,如果我只在一个地方定义operator ==(const String&, const char*)
,为什么它说我有一个重复的符号?
答案 0 :(得分:6)
您在头文件中提供了运算符的定义,它们包含在 String.cpp 和 test2.cpp 中。
您应该将定义移动到一个源文件中,并且只在头文件中提供声明。
// 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;
}