作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
为什么以下不起作用:
std::string fn(int i)
{
sleep(i); // number of seconds to sleep for
std::cout << "Exiting after pausing " << i << " seconds\n";
return std::to_string(i+1);
}
template<typename T, typename U>
int simult( std::function<T(U)> f, std::vector<U> args)
{
return 666;
}
int main()
{
std::vector<int> args { 6, 5, 7 };
int r = simult(fn, args);
}
函数 simult 显然不完整:我只是想在这个阶段编译一些东西。这个想法是您提供一个函数和一个参数列表,并且 simult 将使用线程调用将参数分段应用于 f。
在这个阶段,我只是想找出编译问题。
simult.cc: In function ‘int main()’:
simult.cc:43:25: error: no matching function for call to ‘simult(std::__cxx11::string (&)(int), std::vector<int>&)’
int r = simult(fn, args);
^
simult.cc:23:5: note: candidate: template<class T, class U> int simult(std::function<T(U)>, std::vector<U>)
int simult( std::function<T(U)> f, std::vector<U> args)
^~~~~~
simult.cc:23:5: note: template argument deduction/substitution failed:
simult.cc:43:25: note: mismatched types ‘std::function<T(U)>’ and ‘std::__cxx11::string (*)(int) {aka std::__cxx11::basic_string<char> (*)(int)}’
int r = simult(fn, args);
^
最佳答案
模板推导不会触发隐式转换。尽管函数(指针)类型可以转换到std::function
,但这种转换永远不是模板替换的一部分。
您必须构造 std::function
并将其传递给 simlut
:
int r = simult(std::function<std::string (int)>(fn), args);
关于c++ - 调试模板推演失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37727432/
我是一名优秀的程序员,十分优秀!