2017-07-27 3 views
0

Considérez cette situation: Nous écrivons du code qui fonctionne bien jusqu'à ce que nous incluions un fichier d'en-tête qui possède une fonction surchargeant l'une de nos fonctions d'origine. Dans ce cas, il y a peut-être des endroits où l'appel de la fonction va à la version surchargée pour un meilleur ajustement des paramètres, ce qui est aussi logiquement inattendu. Ce qui est pire, le compilateur ne se plaint pas.Comment résoudre une surcharge erronée en incluant des fichiers d'en-tête en C++

Voici une démo pour préciser ma question:

/* 
For simlicity, I write the codes in different files in this way; 
Whether include header.h behaves differently 
*/ 

// main.cpp 
#include "header.h" // If included, sb will be overloaded 
#include<iostream> 
void sb(int){std::cout << "int" << endl;} 
int main(){ 
    sb(3.5); 
    return 0; 
} 


// header.h 
void sb(double); 


// hehe.cpp 
void sb(double){cout << "double" << endl;} 

Je ne sais pas si ce problème se produit fréquemment ou non, et je me demande s'il y a un moyen de résoudre ou de l'empêcher.

+6

Avez-vous entendu parler de namespaces? – StoryTeller

+0

Utilisez les bonnes pratiques de programmation (espaces de noms, classes, etc.) - placer toutes les fonctions dans le même espace de nom est une recette pour un désastre – UnholySheep

+0

Pourquoi ne pas placer ces fonctions dans des espaces de noms différents? –

Répondre

0

La méthode simple est de ne jamais laisser les surcharges être une meilleure correspondance. La méthode la moins simple (mais plus évolutive) consiste à appliquer une organisation à votre programme, soit des classes, des espaces de noms ou simplement de meilleurs noms de fonctions.

Exemple simple:

void sb(double); 
void sb(int){std::cout << "int" << endl;} 
int main(){ 
    sb(static_cast<int>(3.5)); 
    return 0; 
} 

Moins simple (mais plus évolutive)

namespace some_namespace { // could be a class 
    void sb(double); 
} 
namespace other_namespace { // also could be a class 
    void sb(int){std::cout << "int" << endl;} 
} 
int main(){ 
    other_namespace::sb(3.5); 
    return 0; 
}