2017-07-27 125 views
0

考慮這種情況:我們編寫的代碼運行良好,直到我們包含一個頭文件,該頭文件碰巧有一個函數重載了我們原始函數之一。在這種情況下,可能會有一些地方調用函數進入重載版本以更好地匹配參數,這在邏輯上也是意想不到的。更糟的是,編譯器不會抱怨。在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; 
}