2009-12-24 19 views
3
void outputString(const string &ss) { 
    cout << "outputString(const string&) " + ss << endl; 
} 

void outputString(const string ss) { 
    cout << "outputString(const string) " + ss << endl; 
} 

int main(void) { 
    //! outputString("ambigiousmethod"); 
    const string constStr = "ambigiousmethod2"; 
    //! outputString(constStr); 
} ///:~ 

如何使不同的電話嗎?如何在C++中進行不明確的調用?

編輯:這段代碼可以用g ++和MSVC編譯。

謝謝。

回答

10

C++不允許重載功能,其中在函數簽名的唯一區別是一個接受一個對象和另一個需要參照到對象。因此,像:

void foo(int); 

void foo(int&); 

是不允許的。

您需要更改的數量和/或參數的類型。

在你的情況下,接受reference的函數,如果你想允許函數改變它的參數,你可以讓它接受pointer

+1

by「is not allowed」,你的意思是「不編譯」?如果是這樣的話,gcc版本4.6.3允許我編譯這個,並且如果我試圖調用int i = 1,那麼只會產生編譯模糊性錯誤。 FOO(ⅰ);''。看來OP也能夠編譯。所以我們的編譯器不會實現標準的C++,或者這個答案是錯誤的。我對OP有同樣的問題:如果無法區分呼叫,爲什麼它會被編譯?或者他們可以嗎?如果不是,即使沒有呼叫,給出錯誤也不是稍微好一點的行爲嗎? – 2013-01-08 17:31:49

0

根據你的代碼,U只需要

void outputString(const string &ss). 

因爲這兩種方法不能更改參數給調用者(因爲它是引用或按值傳遞)。

爲什麼你需要這兩種方法?

1

您可以更改其中一種方法的簽名。它可能看起來不漂亮,但它是最簡單的方法。

所以,你可以在原則上有

void outputString(const string &ss, int notneeded) { 
    cout << "outputString(const string&) " + ss << endl; 
} 

void outputString(const string ss) { 
    cout << "outputString(const string) " + ss << endl; 
} 

,當你要撥打的第一個函數只是調用它:

outputString("ambigiousmethod", 0); 

,這將導致一個顯着的呼叫。

有沒有其他辦法(我很樂意在這一個被證明是錯誤的),因爲C++不允許超載,其中傳遞(通過值或引用)是簽名的唯一區別。

編輯:由bzabhi指出的那樣,你也可以通過更改參考指針更改簽名。在你給出的例子中,你可能需要在某些場合改變功能代碼。

+0

,但上面的源代碼可以用g ++和msvc編譯,讓我覺得C++確實提供了一種獨特的調用方式。 – Jichao 2009-12-24 10:12:36

0

我建議使用的給每個身高與技術和功能的每一個唯一的名稱,即不使用語法超載。我一直在使用它多年,我只發現它的優點。

相關問題