2012-01-19 8 views
0

의 벡터에 2 개 벡터를 복사 할 수 없습니다 :C++, 다음과 같은 데이터 유형이 쌍

struct Item { double a, b; Item (double a_, double b_): a(a_), b(b_){}}; 
typedef std::pair <double, Item> TPair; 
typedef std::vector <TPair> TData; 

을 나는 쌍 벡터에 2 개 벡터를 복사 할 :

int main(int argc, char* argv[]) 
{ 
    std::vector <double> t1; 
    std::vector <Item> t2; 

    TData data; 

    //Error 
    std::transform (t1.begin(), t1.end(), data.begin(), 
      std::bind2nd(std::ptr_fun(std::make_pair <double,Item >), double())); 
} 

그러나 컴파일러 정지 다음 오류와 함께 :

Error 1 error C2784: 'std::pointer_to_binary_function<_Arg1,_Arg2,_Result,_Result(__fastcall *)(_Arg1,_Arg2)> 
std::ptr_fun(_Result (__fastcall *)(_Arg1,_Arg2))' : could not deduce template argument for 'overloaded function type' from 'overloaded function type' 
Error 2 error C2784: 'std::pointer_to_binary_function<_Arg1,_Arg2,_Result,_Result(__fastcall *)(_Arg1,_Arg2)> 
std::ptr_fun(_Result (__fastcall *)(_Arg1,_Arg2))' : could not deduce template argument for 'overloaded function type' from 'overloaded function type' 

어디에서 문제가 발생합니까? 당신의 도움을 주셔서 감사합니다. 컴파일러 MSVS 2010 x86. Boost가없는 솔루션을 선호합니다.

업데이트 질문 오류가 dasblinkenlight에 의해 발견 된, 수정 된 코드 : std::make_pair<double,Item>의 두 번째 매개 변수가 Item하지

+0

어떤 컴파일러를 사용하고 있습니까? 최근 컴파일러 (즉, 람다 표현식)에서이를 수행하는 더 간단한 방법이 있습니다. –

답변

1

make_pair<double,Item>의 두 번째 인자는 아닌 doubleItem이다

그럼
std::pair<double,Item> make_pair(const double db, const Item it) { 
    return std::pair<double,Item>(db, it); 
} 

호출은 다음과 같다 :

std::transform (t1.begin(), t1.end(), data.begin(), 
    std::bind2nd(std::ptr_fun(std::make_pair <double,Item >), Item(0,0))); 

EDIT가 다음과 같이 MS VS를 들어, I는 make_pair 정의

std::transform (t1.begin(), t1.end(), data.begin(), 
    std::bind2nd(std::ptr_fun<double,Item,std::pair<double,Item> >(make_pair), Item(0,0))); 
+0

다른 가능성을 추측하기 위해 +1 –

+0

@R.MartinhoFernandes 글쎄,'bind1st'를 사용하기 위해서는't1'을't2'로 대체해야합니다. 왜 OP가 transform을 사용하기를 좋아하는지 모르겠다. 왜냐하면 OP를 사용하여 두 벡터를 "압축"하기가 어렵 기 때문이다. 'for' 루프로 갈 것입니다 : – dasblinkenlight

+0

@dasblinkenlight zip을위한 꽤 좋은'std :: transform'의 바이너리 버전이 있습니다. 나는 왜 C++ 11이 n-ary 형식을 추가하지 않았는지 알지 못합니다. 나에게 제안하는 아이디어 같아. – pmr

1

std::transform (t1.begin(), t1.end(), data.begin(), std::bind1st(std::ptr_fun(std::make_pair <double,Item >), double())); 

그러나 컴파일러는 같은 오류를 보여줍니다 ... a double. 대신 std::bind1st을 사용하고 싶습니다.

+0

@ R. Martinho Fernandes : 예, 당신 말이 맞아요 ... 나는 그것을 알아 채지 못했습니다.하지만 코드에 같은 오류가 있습니다. – justik

1

y 그들은 단지 으로가는 deprecated 바인더를 사용해서는 안된다. 기본적으로 을 해결할 수 없기 때문에 (인자가 두 개 이상있는 멤버 함수, 더 많은 인자를 가진 , 알려지지 않은 리턴 타입보다) 무언가에 충돌하기 전에 몇 미터 걸린다. 그들은 C++ 11 람다와 호환되지 않습니다. 어느 정도의 순방향 호환성을 위해서는 boost::bind을 사용하십시오. 코드는 효율적이된다 : (다른 사람이 out` 지적대로, bind1st 당신이 에 잘못된 위치를 인수 바인딩 때문에) 템플릿 인수

boost::bind(make_pair<double, Item>, double(), _1); 

자격 make_pairstd::bind1st 함께 필요합니다. 추가 보너스로

는 C++ 03 솔루션 :

std::bind1st(std::ptr_fun(std::make_pair<int, Item>), int()); 

어느, 호기심, 4.6.2에 11 C++로 컴파일하지 않습니다. 나는 아직 이유를 알아 냈습니다. 그러나 권장되지 않는 이유는 무엇입니까? 사용하지 않는 바인더를 사용해야하는 이유는 무엇입니까?

+0

부스트가없는 해결책이 있습니까? – justik

+0

@justik 모든 최신 컴파일러에는'std :: bind'를 갖는'TR1' 구현이 있습니다. – pmr

+0

고마워,하지만 VS2010 동일한 컴파일러 오류를 보여줍니다 :-(. – justik