2013-05-17 76 views
0

我已經寫了下面的模板成員函數,但我不能把它而不被編譯器收到錯誤:模板成員函數的錯誤:鐺不匹配任何成員函數

template <class T, class A> 
auto tpool::enqueue(T&& func, std::vector<A>&& args) 
-> std::vector<std::future<decltype(std::forward<T>(func)(decltype(std::forward<A(args))::value_type))>> 
{ 
    //... 
} 

tpool tp(); 
auto f = [] (int) { /* ... */ }; 
std::vector<int> args; 

tp.enqueue(f, args); 

我得到以下錯誤通過鐺:

test_cpp.cpp:144:5: error: no matching member function for call to 'enqueue' 
    tp.enqueue(f, args); 

test_cpp.cpp:107:13: note: candidate template ignored: substitution failure [with T = <lambda at test_cpp.cpp:140:11> &, A = int]: no matching function for call to 'forward' 
auto tpool::enqueue(T&& func, std::vector<A>&& args) 
+1

通過'tpool tp();'你的意思是'tpool tp;'? – kennytm

+0

你有幾個語法錯誤。例如,'std :: forward stardust

回答

2
template <class T, class A> 
auto tpool::enqueue(T&& func, std::vector<A>&& args) 

這使得args是一個rvalue參考,這僅接受右值,但在

std::vector<int> args; 
tp.enqueue(f, args); 

args是一個左值,因此候選被忽略。

請注意,T&& func允許左值綁定,因爲模板替換可以允許T本身是一個左值引用,然後我們有(T&)&& == T&。但是這對於args是不可能的,因爲不管A是什麼,std::vector<...>&&總是一個向量的右值引用。


如果你不打算複製或修改args反正,你可以傳遞,而不是一個常量參考:

template <class T, class A> 
auto tpool::enqueue(T&& func, const std::vector<A>& args) 

你也可以讓完美轉發,不指定該args絕作爲一個矢量:

template <class T, class V> 
auto tpool::enqueue(T&& func, V&& args) 
    -> std::vector<std::future<decltype(func(args.front()))>>