奇数重复符号错误

Aus*_*yde 4 c++ debugging

对于一个学校项目,该课程被要求编写一个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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为我定义的唯一地方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
Run Code Online (Sandbox Code Playgroud)

test2.cpp只有一个裸main方法:

#include "String.h"
using namespace std;

int main() {

}
Run Code Online (Sandbox Code Playgroud)

那么,如果我只operator ==(const String&, const char*)在一个地方定义,为什么它说我有一个重复的符号?

Geo*_*che 6

您在头文件中提供了运算符的定义,它们包含在String.cpptest2.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; 
}
Run Code Online (Sandbox Code Playgroud)

  • 或者,在头文件中内联定义.一般规则是头文件中的任何函数定义都应该是内联的,源文件中的定义不应该是内联的. (2认同)