2017-07-27 3 views
0

この状況を考えてみましょう:元の関数のうちの1つをオーバーロードする関数を持つヘッダーファイルをインクルードするまでうまくいくコードを記述します。この場合、パラメータのより良い適合のために関数の呼び出しがオーバーロードされたバージョンに行き、論理的に予期せぬ場所があるかもしれません。さらに悪いことに、コンパイラは不平を言っていません。ここでC++でヘッダーファイルをインクルードするときに間違ったオーバーロードを解決する方法

は私の質問を明確にするデモです:

/* 
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;} 

私は、この問題が頻繁にか起こるかわかりませんし、それを解決または防止するために、どのような方法があるかどうかだろう。

+6

あなたは、名前空間のことを聞いたことがありますか? – StoryTeller

+0

適切なプログラミング方法(名前空間、クラスなど)を使用する - すべての関数を同じ名前空間に入れることは、災害のためのレシピです – UnholySheep

+0

これらの関数を異なる名前空間に入れないのはなぜですか? –

答えて

0

単純な方法は、オーバーロードを決してより良いものにすることではありません。あまり単純ではありませんが(スケーラビリティの高い)メソッドは、クラス、名前空間、またはより良い関数名のいずれかのプログラムに組織を適用することです。

簡単な例:

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

少ないシンプルな(しかし、よりスケーラブル)

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; 
} 
関連する問題