2010-06-23 4 views
1

Je reçois des erreurs comme:C++ erreur redéfinition de classe aide

FxMathFunctions.h: In function 'FxInt32 IMin(FxInt32, FxInt32)': 

FxMathFunctions.h:13: error: redefinition of 'FxInt32 IMin(FxInt32, FxInt32)' 

FxMathFunctions.h:15: error: 'FxInt32 IMin(FxInt32, FxInt32)' previously defined here 

Dans FxMathFunctions.h J'ai:

11: struct FxPoint2d; 
12: 
13: inline FxInt32 IMin(FxInt32 i1,FxInt32 i2) 
14: { 
15: if (i2 < i1) i1 = i2; 
16: return i1; 
17: } 

FxInt32 est défini dans un en-tête que je suis notamment que:

typedef long    FxInt32; 

Je ne peux pas décider par les erreurs si elle dit que FxInt32 est redéfini ou si la fonction entière est.

Comment résoudre ce problème?

MISE À JOUR J'ai ajouté les numéros de ligne ci-dessus.

+0

Que se passe-t-il sur les lignes 13 et 15 de FxMathFunctions.h? – bdonlan

+0

C'est très étrange. On dirait que les numéros de lignes ont été légèrement modifiés. Qu'y a-t-il sur la ligne 11-12? – bdonlan

+0

@bdonlan - mis à jour à nouveau – Elliot

Répondre

0

Déplacez la définition de la fonction dans un fichier .cpp et avez juste le prototype dans le fichier .h. Laissez le compileur s'inquiéter de l'optimisation

+0

Pour ce faire, je n'utiliserais pas inline dans le fichier .cpp, correct? et comment je changerais pour mettre le prototype dans le .h? L'utilisation de inline me trouble, je ne l'enlève pas puisque je déplace le code dans le .cpp? – Elliot

+0

Oui, pas besoin de ligne dans le fichier .cpp. Le mot clé inline est une directive indiquant au compilateur de copier toute l'implémentation de la fonction au lieu de simplement appeler la fonction. Il suffit de retirer l'inline, mettre FxInt32 IMin (FxInt32 i1, FxInt32 i2); dans votre en-tête et la définition dans le fichier .cpp et vous êtes prêt à partir. Le typedef que vous devriez placer dans l'en-tête bien sûr. –

0

Il est difficile de dire sans savoir ce qu'il y a sur les lignes 13 et 15 de FxMathFunctions.h. Cela dit, gardez à l'esprit que C++ a intégré std::min et std::max dans <algorithm>, et ils fonctionnent pour tous les types comparables.

+0

Merci, laissez-moi regarder dans ces derniers. – Elliot

+0

Liens supplémentaires à la documentation pour vous – bdonlan

1

Il est dit que toute la fonction est définie deux fois. Mes pouvoirs de débogage psychique me disent que vous incluez de façon récursive cet en-tête, et que cet en-tête ne dispose pas d'une protection adéquate contre ce qui se passe. Ainsi, la fonction inline est définie deux fois.

+0

Mes pouvoirs psychiques d'upvoting me disent que vous avez probablement raison. –

+0

Bizarre - pourquoi les numéros de ligne signalés seraient-ils décalés alors? – bdonlan

+0

J'ai un garde-tête en place et pour être sûr, j'ai changé le nom de celui-ci. #pragma une fois aussi – Elliot