2015-07-11 57 views
0

我有這個相當簡單的模板類:的std ::功能不能在模板實例推斷重載型

template <typename Value> 
struct Foo { 
    typedef Value ValueType; 
    Value array[3]; 
}; 

現在我嘗試使用依賴型,以得到一個簡單的函數的函數對象(std::functionF作爲函數參數和返回類型。

template <typename F> 
void floorfunc(const F& foo) { 
    typedef typename F::ValueType Value; 
    auto fptr = std::function<Value(Value)>(std::floor); 
} 

編譯器能夠正確instanciates的Value類型,但不能猜測floor正確的函數重載,並把我這個錯誤信息需要使用

error: no matching function for call to 'std::function<float(float)>::function(<unresolved overloaded function type> 

我如何告訴編譯器至極超載在這種情況下 ?

回答

1

添加投:

std::function<Value(Value)>(static_cast<Value(&)(Value)>(std::floor)) 

std::floor過載,並std::function構造函數是一個模板,所以有超載沒有明顯的選擇,你必須明確地指定它,你可以跟投做。

+1

它不能被包裹在lambda中嗎?例如,'std :: function ([](float f){return std :: floor(f);});'。 –

+0

@JamesAdkison:當你嘗試時會發生什麼? –

+0

我剛試過,因爲你問了,它似乎工作(Visual Studio 2013)。 –