2013-07-22 2 views
0

내부 inner_product하도록하며 binary_function 전달할 때 다음 코드컴파일러 에러 다른 함수

$ cat test02.cpp 
#include <string> 
#include <numeric> 
#include <cstdlib> 
#include <list> 
#include <iostream> 

struct myadd : 
    public std::binary_function 
     <const std::string&,const std::string&,std::string> 
{ 
    std::string operator() (const std::string& x,const std::string& y) const { 
     return x+" "+y; 
    } 
}; 

struct mymul : 
    public std::binary_function 
     <const std::string&,const std::string&,std::string> 
{ 
    std::string operator() (const std::string& x,const std::string& y) const { 
     return x+y; 
    } 
}; 

std::string spliceme(
    const std::list <std::string>& list1, 
    const std::list <std::string>& list2, 
    const std::binary_function 
     <const std::string&,const std::string&,std::string>& add, 
    const std::binary_function 
     <const std::string&,const std::string&,std::string>& mul 
) { 
    return std::inner_product(list1.cbegin(),list1.cend(),list2.cbegin(), 
     std::string(""),add,mul); 
} 

int main() { 
    std::list <std::string> list1; 
     list1.emplace_back("First"); 
     list1.emplace_back("Second"); 
     list1.emplace_back("Third"); 
    std::list <std::string> list2; 
     list2.emplace_back("Foerst"); 
     list2.emplace_back("Annen"); 
     list2.emplace_back("Tredje"); 

    std::string result = spliceme(list1,list2,myadd(),mymul()); 
    std::cout << result << std::endl; 

    return EXIT_SUCCESS; 
} 

컴파일러 에러를 생성

문제는 라인에서 발생
g++ -std=c++0x test02.cpp -o test02 
In file included from /usr/lib/gcc/i686-pc-linux-gnu/4.6.3/include/g++-v4/numeric:62:0, 
       from test02.cpp:2: 
/usr/lib/gcc/i686-pc-linux-gnu/4.6.3/include/g++-v4/bits/stl_numeric.h: In function '_Tp std::inner_product(_InputIterator1, _InputIterator1, _InputIterator2, _Tp, _BinaryOperation1, _BinaryOperation2) [with _InputIterator1 = std::_List_const_iterator<std::basic_string<char> >, _InputIterator2 = std::_List_const_iterator<std::basic_string<char> >, _Tp = std::basic_string<char>, _BinaryOperation1 = myadd, _BinaryOperation2 = std::binary_function<const std::basic_string<char>&, const std::basic_string<char>&, std::basic_string<char> >]': 
test02.cpp:29:101: instantiated from here 
/usr/lib/gcc/i686-pc-linux-gnu/4.6.3/include/g++-v4/bits/stl_numeric.h:218:2: error: no match for call to '(std::binary_function<const std::basic_string<char>&, const std::basic_string<char>&, std::basic_string<char> >) (const std::basic_string<char>&, const std::basic_string<char>&)' 
make: *** [all] Error 1 

:

return std::inner_product(list1.cbegin(),list1.cend(),list2.cbegin(), 
    std::string(""),add,mul); 

myadd 및 mymul 클래스를 직접 인스턴스화하는 경우 :

return std::inner_product(list1.cbegin(),list1.cend(),list2.cbegin(), 
    std::string(""),myadd(),mymul()); 

모든 것이 올바르게 컴파일되고 실행됩니다. 함수에서 spliceme 함수에 mul을 추가하는 방법에있어 잘못된 점이 있습니까?

답변

3

없기 때문에 어느 쪽이 :

std::string spliceme(
    const std::list <std::string>& list1, 
    const std::list <std::string>& list2, 
    const std::function<std::string(const std::string&,const std::string&)>& add, 
    const std::function<std::string(const std::string&,const std::string&)>& mul 
) { 
    return std::inner_product(list1.cbegin(),list1.cend(),list2.cbegin(), 
    std::string(""),add,mul); 
} 

하거나 :

template<typename Add, typename Mul> 
std::string spliceme(
    const std::list <std::string>& list1, 
    const std::list <std::string>& list2, 
    const Add& add, 
    const Mul& mul 
) { 
    return std::inner_product(list1.cbegin(),list1.cend(),list2.cbegin(), 
    std::string(""),add,mul); 
} 

은 코드 작동을 도와줍니다. 첫 번째는 유형 지우기 기능을 사용하고 두 번째는 펑터를 template 사용합니다. 첫 번째는 헤더에서 몸을 나눌 수 있고 두 번째는 향상된 인라인을 허용합니다.

2
std::string spliceme(
    const std::list <std::string>& list1, 
    const std::list <std::string>& list2, 
    const std::binary_function 
     <const std::string&,const std::string&,std::string>& add, 
    const std::binary_function 
     <const std::string&,const std::string&,std::string>& mul 
) 

는 같아야

std::string spliceme(
    const std::list <std::string>& list1, 
    const std::list <std::string>& list2, 
    const myadd& add, 
    const mymul& mul 
) { 

연산자() 함수 가상

+0

myadd 및 mymul뿐만 아니라 임의의 이진 함수를 전달할 수 있기를 바랍니다. – wyer33

1

std::binary_function은 함수 개체에 세 개의 typedef를 추가하기위한 편리한 템플릿입니다. 함수 시그니처에서 기본 클래스로 사용되도록 의도되지 않았습니다. 왜냐하면 모든 일은 객체가 슬라이스되기 때문입니다. C++ 11에서는 더 이상 사용되지 않아야합니다. Yakk은 여러분이해야 할 일에 대해 훌륭한 답을줍니다. 이러한 typedef (first_argument_type, second_argument_typeresult_type)가 실제로 필요한 경우 직접 추가하십시오.