2013-03-25 91 views
1

我試圖將一個重載的函數指針作爲參數傳遞給模板函數。帶模板參數的函數指針模糊

float Function1(float par1) 
{ 
return 0; 
} 

float Function1(float par1, float par2) 
{ 
return 0; 
} 

template<typename R, typename A1> 
void Bind(R(*func)(A1)) 
{ 
    std::cout << "Correct one called\n"; 
} 

template<typename R, typename A1, typename A2> 
void Bind(R(*func)(A1, A2)) 
{ 
    std::cout << "False one called\n"; 
} 

int main() 
{ 
Bind<float, float>(&Function1); 
} 

即使壽我打電話用2浮動參數顯式的函數,編譯器似乎無法解析正確的電話。 編譯器顯示'模糊函數調用'錯誤。

我創建了一個小樣本的位置: http://liveworkspace.org/code/4kVlUY$195

這是什麼錯誤的原因是什麼? 謝謝。

回答

6

歧義來當你嘗試採取Function1的地址。編譯器會看到2個重載,它不知道你指的是哪一個。您需要明確地說明你想要哪一個:

Bind(
    static_cast<float(*)(float, float)>(&Function1) 
); 

就表示模板參數明確地在電話會議中Bind,但爲時已晚,模糊了這一點之前找到。

+0

是仍然需要綁定調用然後,因爲歧義在別處? – stijn 2013-03-25 12:00:35

+0

我可以安全地忽略在這一點上我假設? Bind( static_cast (&Function1) ); – mikbal 2013-03-25 12:09:56

+0

當然,模板參數將被推斷出來。 – mfontanini 2013-03-25 12:10:50

4

您需要手動解決歧義,例如使用強制轉換表達式。

Bind<float, float>(static_cast< float (*)(float par1, float par2)>(&Function1)); 

根據錯誤信息,這不是Function1這是模糊的,這是Bind

Compilation finished with errors: 
source.cpp:31:4: error: call to 'Bind' is ambiguous 
Bind<float, float>(&Function1); 
^~~~~~~~~~~~~~~~~~ 

source.cpp:18:6: note: candidate function [with R = float, A1 = float] 
void Bind(R(*func)(A1)) 
^ 
source.cpp:24:6: note: candidate function [with R = float, A1 = float, A2 = float] 
void Bind(R(*func)(A1, A2)) 

的問題是,你指定的兩個參數,<float, float>,但不排除第三參數,它是自動推斷的可能性。 C++允許對同一個函數模板調用的顯式和隱式參數!

另一種解決方法是強制它解析模板名稱而不考慮隱式參數。這works太多,但它更多的hackish:

(*&Bind<float, float>)(&Function1); // Taking address first hides arguments from deduction 
+0

如果問題是綁定中的模板,那麼這將工作:http://liveworkspace.org/code/U5NJL$0。問題在於採用重載函數的地址。編譯器如何知道你指的是哪個重載? – mfontanini 2013-03-25 12:15:56

+0

@mfontanini它可以通過函數指針參數的類型解決重載問題。您只是通過刪除顯式參數來引入更多歧義。查看我的黑客解決方案,瞭解無法投射的東西。 – Potatoswatter 2013-03-25 12:20:11

+0

你是對的人:D – mfontanini 2013-03-25 12:23:49