2013-05-18 79 views
1

我試圖使用舊bind2nd函數以這種方式:C++函數對象結合

template<typename T> 
class printer 
{ 
public: 
    void operator()(T a, string& kd) 
    { 
     cout<<a<<endl; 
    } 
}; 


int main(int argc, char *argv[]) 
{ 
    string nme = "J-dar"; 
    auto f1 = bind2nd(printer<int>(),nme); 

    //f1(5); 
    return 0; 
} 

,但我得到了很多的錯誤:

required from here 
error: no type named 'first_argument_type' in 'class printer<int>' class binder2nd  ^
error: no type named 'second_argument_type' in 'class printer<int>' typename _Operation::second_argument_type value;           ^
error: no type named 'second_argument_type' in 'class printer<int>' binder2nd(const _Operation& __x, ^
error: no type named 'result_type' in 'class printer<int>' operator()(const typename _Operation::first_argument_type& __x) const ^
error: no type named 'result_type' in 'class printer<int>' operator()(typename  _Operation::first_argument_type& __x) const ^
required from here 
error: no type named 'second_argument_type' in 'class printer<int>' typedef typename _Operation::second_argument_type _Arg2_type;           

從我可以看到它是正確的,所以我真的不知道發生了什麼。^

+1

從我的鏈接,似乎'std :: ptr_fun'可以節省一些工作在這裏。從我的鏈接去看看http://stackoverflow.com/questions/1418756/how-to-use-bind1st-and-bind2nd – chris

回答

6

首先的:我會建議使用放棄bind1st()bind2nd(),這是過時的C + 11,和一般的C++ 03標準庫函數編程過時的支持。

你還是使用C++ 11的​​,因爲它似乎你能負擔得起的 - 從事實判斷出你使用的是auto關鍵字:

#include <functional> 

// ... 

auto f1 = std::bind(printer<int>(), std::placeholders::_1, nme); 

此說只是爲記錄,已棄用的std::bind2nd()函數需要一些關於函數調用操作符簽名的元數據,並且它期望這些元數據作爲函數類中的類型別名提供。例如:

template<typename T> 
class printer 
{ 
public: 

    // These metadata must be present in order for bind1st and bind2nd to work... 
    typedef void result_type; 
    typedef T first_argument_type; 
    typedef string const& second_argument_type; 

    void operator()(T a, string const& kd) const 
//           ^^^^^ // Bonus advice #1: 
//            // This could and should be 
//            // const-qualified 
//        ^^^^^ 
//        Bonus advice #2: why not taking by 
//        reference to const here? ;) 
    { 
     cout<<a<<endl; 
    } 
}; 

上述實現的更簡單的方法是使用(也已棄用)類模板std::binary_function作爲基類,並讓這類模板定義合適的類型別名:

template<typename T> 
class printer : public std::binary_function<T, string const&, void> 
//    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
{ 
public: 
    void operator()(T a, string const& kd) const 
    { 
     cout<<a<<endl; 
    } 
}; 

但是,請再考慮將std::bind1st(),std::bind2nd()以及std::unary_functionstd::binary_function放回抽屜。它們被C++ 11對函數式編程更強大的支持所取代。

+1

。 – chris

+0

@chris:你說得對,我其實只檢查了接受的答案;)編輯,謝謝 –

+0

@chris:我選擇了一個更徹底的編輯。 'std :: bind()'是正確的路要走,不想太堅持其他解決方案。無論如何感謝 –