我正在學習如何在C++中使用標準泛型算法。在下面的代碼示例中,我試圖通過將兩個操作(string to const char* and const char* to double)
合併爲一個的自定義撰寫函數的幫助將字符串轉換爲double。在C++中使用適應性函數對象編譯錯誤
我寫了unary_composer
作爲一個適應性功能對象。
然而,當我編譯它,我收到以下錯誤
錯誤2錯誤C2664:「雙unary_composer ::運算符()(常量 的std :: basic_string的< _Elem,_Traits,_AX> *) 「:不能從轉換參數1 '的std :: basic_string的< _Elem,_Traits,_AX>' 到 '常量 的std :: basic_string的< _Elem,_Traits,_AX> *
'
using namespace std;
template<typename F1, typename F2>
class unary_composer : public unary_function<typename F2::argument_type, typename F1::result_type>
{
F1 f1;
F2 f2;
public:
unary_composer(F1 lf1, F2 lf2) : f1(lf1), f2(lf2){}
typename F1::result_type operator()(typename F2::argument_type x)
{
return f1(f2(x));
}
};
template <typename F1, typename F2>
unary_composer<F1, F2> compose(F1 fone, F2 ftwo)
{
return unary_composer<F1, F2>(fone, ftwo);
}
int _tmain(int argc, _TCHAR* argv[])
{
const int SZ = 9;
vector<string> vs(SZ);
srand(time(0));
generate(vs.begin(), vs.end(), NumGenerator()); // Generates strings with random digits ex: "12.35". NumGenerator is defined in another source file.
vector<double> vd;
// Transform the strings to doubles
transform(vs.begin(), vs.end(), back_inserter(vd), compose(ptr_fun(atof), mem_fn(&string::c_str)));
copy(vd.begin(), vd.end(), ostream_iterator<double>(cout, " ")); // print to console
cout<<endl;
return 0;
}
當我使用mem_fun_ref
代替mem_fn
時,它工作正常。也許,錯誤說opeartor函數期望const string*
類型的參數,但字符串正在通過。但我不知道如何解決它。我錯過了什麼?
PS:這個例子是從C++ VOL2(CHAPT 6)的思考採取
感謝πάνταῥεῖ進行編輯。 – cexplorer
問題是'mem_fn :: argument_type',它是一個指針。你堅持使用C++ 03還是可以使用更新的版本? – juanchopanza
我正在使用VS2010。 – cexplorer