2010-02-08 5 views
3

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?

Répondre

6

Vous avez fourni les définitions des opérateurs dans le fichier d'en-tête qui sera inclus à la fois par String.cpp et test2.cpp.
Vous devez déplacer les définitions dans un fichier source et fournir uniquement les déclarations dans le fichier d'en-tête.

// 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; 
} 
+2

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

Questions connexes