c++ - 调试模板推演失败

标签 c++ templates

为什么以下不起作用:

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/

相关文章:

visual-studio - Visual Studio 自定义项模板依赖于

c++ - C++ 标准是否要求对 wchar_t 进行编码?

android - 我想在 android 中将音频服务器 (/frameworks/av/media/audioserver) 构建为 64 位,但它无法启动

python - 在渲染之前对 django 模板节点进行后处理以组合标签

c++ - 在运行时有条件地实例化模板

c++ - 模板 <> 不工作或用于整数

c++ - 如何隐藏数独表中的数字?

c++ - 数组因第一个索引而崩溃

c++ - 对于带有自动参数的 lambda,是否有 std::function 类型或类似类型?

c++ - 如何将模板化的结构/类声明为 friend ?