gpt4 book ai didi

c++ - 将 binary_function 传递给另一个函数内的 inner_product 时出现编译器错误

转载 作者:太空宇宙 更新时间:2023-11-04 15:45:06 24 4
gpt4 key购买 nike

以下代码:

$ 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());

一切都能正确编译和运行。我将函数 add 和 mul 传递给函数 spliceme 的方式有什么问题?

最佳答案

要么这样:

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 仿函数。第一个让你把你的 body 从标题中分离出来,第二个允许改进内联。

关于c++ - 将 binary_function 传递给另一个函数内的 inner_product 时出现编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17796415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com