【发布时间】:2016-12-15 13:40:12
【问题描述】:
我想将标准化的 C++ 二进制函数传递给模板函数,但不知何故我没有让它工作。
以下是我的尝试:
template<template <typename> typename Pred,typename T, typename Iterator>
void iota_stepa(Iterator begin, Iterator end, T startofSequence_, T threadStep)
{
int currMaxThreads = startofSequence_;
bool first = true;
generate(begin, end, Pred<T>(currMaxThreads, threadStep) );
}
并通过以下方式对其进行测试:
vector<int> tempVect_(10, 0);
iota_stepa<std::plus>(begin(tempVect_),end(tempVect_),1,thread::hardware_concurrency());
不幸的是给了我错误:
Severity Code Description Project File Line Suppression State
Error C2440 '<function-style-cast>': cannot convert from 'initializer list' to 'std::plus<int>'
Error C2672 'generate': no matching overloaded function found FractalCarpet
Error C2780 'void std::generate(_FwdIt,_FwdIt,_Fn0)': expects 3 arguments - 2 provided FractalCarpet
控制台输出如下所示:
1> c:\users\mtunca\documents\esd\sps\fractalcarpet\main.cpp(55): note: see reference to function template instantiation 'void iota_stepa<std::plus,int,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<float>>>>(Iterator,Iterator,T,T)' being compiled
1> with
1> [
1> Iterator=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<float>>>,
1> T=int
1> ]
1>c:\users\mtunca\documents\esd\sps\fractalcarpet\main.cpp(34): error C2672: 'generate': no matching overloaded function found
1>c:\users\mtunca\documents\esd\sps\fractalcarpet\main.cpp(34): error C2780: 'void std::generate(_FwdIt,_FwdIt,_Fn0)': expects 3 arguments - 2 provided
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm(1532): note: see declaration of 'std::generate'
谁能帮帮我,如何解决这个问题?
【问题讨论】:
-
输出窗口中的有用信息通常比错误列表中的更多。
-
如果
startofSequence和threadStep都是整数(int和unsigned int),那么T到底如何解析为浮点数?我无法完全重现它。至于C2780- 你的std::plus构造函数看起来很奇怪,你为什么要向它传递参数? -
就我个人而言,我只是将它作为
iota_stepa的函数参数,然后给它一个像Func这样的模板类型。这样你就可以传递其他“函数”,比如 lambdas。 -
您希望
Pred<T>(currMaxThreads, threadStep)生成什么?generate需要一个不带参数并在调用时返回值的函数。您将不得不将类似行为的东西传递给它。 -
generate采用无参数函数,返回“下一个”元素。std::plus的实例将两个数字相加。如果您描述了您正在尝试解决的问题,而不是您在尝试解决问题时遇到的问题,您可能会得到更好的帮助。
标签: c++ c++11 templates stl std