Fonction déjà définie erreur en C++
J'ai un fichier appelé "SimpleFunctions.h" définis comme suit:
#ifndef SIMPLEFUNCTIONS_H
#define SIMPLEFUNCTIONS_H
namespace my_namespace {
double round(double r) { return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5); }
float round(float r) { return round((double)r); }
}
#endif //SIMPLEFUNCTIONS_H
Ce fichier a déjà été inclus dans un seul fichier et ça marchait très bien.
Maintenant, aujourd'hui, je l'ai incluse dans un deuxième fichier et il ne fonctionne plus. Au moment de la liaison, il me dit que la fonction est déjà défini dans "firstfile.obj".
Cependant, depuis que je suis en utilisant inclure des gardes, je m'attendrais à l'exercice de la fonction définie qu'une seule fois, ou j'ai loupé quelque chose?
OriginalL'auteur this.lau_ | 2011-08-06
Vous devez vous connecter pour publier un commentaire.
Par défaut, ces fonctions ont une liaison externe. Cela signifie que chaque unité de traduction dispose de fonctions appelé à double tour(double r) et float ronde(float r), ce qui provoque une collision de nom au moment de la liaison.
Les solutions possibles sont:
Lire la suite ici:
Qu'est ce qu'une liaison externe et interne de liaison?
Par la voie, comprenant des protections protéger une seule unité de traduction à partir de l'inclusion d'un fichier d'en-tête à plusieurs reprises. C'est un problème différent que ce que vous voyez ici.
inline
n' pas implique interne. lien. stackoverflow.com/questions/4957582/...mon erreur--j'ai édité la réponse
OriginalL'auteur pepsi
utiliser 'inline'
Le compilateur ne sera pas nécessairement insérer le code (bien que pour ce court func il peut), mais l'éditeur de liens ne permet pas de traiter est comme une fonction distincte plus.
Note - inclure les gardes arrêtent le même inclure le fichier inclus plus d'une fois dans le même fichier source (à strictement parler de la compilation "unité"), il ne veut pas l'empêcher d'être inclus dans des fichiers sources distincts qui sont liés ensemble. C'est pourquoi, normalement, vous le déclarer dans un en-tête, mais de définir la fonction dans un fichier c
Je voudrais savoir aussi!:)
Il est séparé de l'unité de traduction - macro définit ne couvrent pas les unités de traduction (compilateur invocations). L'éditeur de liens a maintenant 2 les définitions de la tour, et les erreurs.
static
est également correcte pour résoudre le problème.OriginalL'auteur Martin Beckett
Une meilleure façon de résoudre le problème par le biais de modèles. Votre code ne compile très bien si vous décidez de faire quelque chose le long des lignes de:
Votre linker va arrêter de se plaindre et vous aurez une fonction unique pour tous vos besoins.
Cette solution peut être améliorée avec des traits de type. Voir boost::is_floating_point et boost::enable_if
OriginalL'auteur David Stone