Pour un projet d'école, la classe a été invitée à écrire une classe String
pour imiter la classe STL string
.Erreur de symboles en double impairs
J'ai tout le code écrit, mais l'éditeur de liens semble être rattrapé par l'un de mes opérateurs.
Il y a trois fichiers, String.h
, String.cpp
et test2.cpp
Mon Makefile
ressemble
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
produit les éléments suivants:
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
C'est étrange, puisque le seul endroit Je définis operator ==
est en 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
a seulement une méthode main
nu:
#include "String.h"
using namespace std;
int main() {
}
Donc, si je ne operator ==(const String&, const char*)
définir en un seul endroit, pourquoi est-ce que j'ai un symbole en double?
Vous pouvez également définir les définitions dans le fichier d'en-tête. La règle générale est que toute définition de fonction dans un fichier d'en-tête doit être en ligne, et les définitions d'un fichier source ne doivent pas être en ligne. – KeithB