2013-10-08 66 views
-6

爲什麼在下面的代碼中出現錯誤?我該如何解決它?函數模板和void

#include <functional> 
#include <iostream> 

int foo() 
{ 
    std::cout << "::foo() \n"; 
    return 0; 
} 

void bar() 
{ 
    std::cout << "::bar() \n"; 
} 

template <typename T> 
T Hook(const std::function<T()>& action, T def = T()) 
{ 
    try 
    { 
     return action(); 
    } 
    catch (const std::exception& ex) 
    { 

    } 
    catch (...) 
    { 

    } 
    return def; 
}; 

int main() 
{ 
    std::function<int()> foo_func(foo); 
    Hook(foo_func); 

    std::function<void()> bar_func(bar); 
    // Hook(bar_func); // Error 
} 
+2

你試圖返回一個空值? – Shaggi

+1

@Shaggi是的,我可以做到 - http://ideone.com/0835o2 – FrozenHeart

+6

你得到什麼錯誤? –

回答

4

當問一個編譯器/連接錯誤,總是包括在你的問題的錯誤。

然而,問題是,bar返回void,這意味着HookT模板參數被推斷爲void。然後,對於def的默認參數,您正嘗試創建void類型的對象。這當然是非法的。

你必須爲void函數提供的Hook專業化(或更好,過載):

template <typename T> 
T Hook(const std::function<T()>& action, T def = T()) 
{ 
    try 
    { 
     return action(); 
    } 
    catch (const std::exception& ex) 
    { 

    } 
    catch (...) 
    { 

    } 
    return def; 
}; 


void Hook(const std::function<void()>& action) 
{ 
    try 
    { 
     action(); 
    } 
    catch (const std::exception& ex) 
    { 

    } 
    catch (...) 
    { 

    } 
}; 
+0

你打敗了我;-) –

+1

你仍然可以在void類型的情況下返回action()嗎? –

+0

@ChristianRau可能不是,C&P錯誤。修正了,謝謝。 – Angew