要么是我对C++的理解有问题,要么是某个地方有一个隐藏的拼写错误。。。我在那几个LOCA上浪费了几个小时。
首先,我定义了
start()
方法如下:
template <typename FunctionResult, typename ...FunctionArgs>
inline std::shared_ptr<StoppableThread> start(
std::function<FunctionResult(const bool&, FunctionArgs...)> function, FunctionArgs... args)
{ ... }
此外,一些
threadedSearch()
lambda函数:
std::function<void(const bool&,
const Source&, Population&,
const std::vector<Parameter>&,
const size_t&, const size_t&)> threadedSearch = ... ;
但当我尝试执行此操作时:
Source source = { ... };
Population population = { ... };
const std::vector<Parameter> variationsParameters = { ... };
const size_t randomCandidatesCount = ..., lineageCount = ...;
auto searchThread = start(
threadedSearch,
source, population,
variationsParameters,
randomCandidatesCount, lineageCount);
编译器不同意后一种对的调用
starŧ()
,告诉我:
# with g++
error: no matching function for call to
âstart(std::function<void(const bool&, const Source&, Population&, const std::vector<Parameter>&, const long unsigned int&, const long unsigned int&)>&,
Source&, Population&, const std::vector<Parameter>&, const size_t&, const size_t&)â
[...]
note: candidate: âtemplate<class FunctionResult, class ... FunctionArgs> std::shared_ptr<StoppableThread>
start(std::function<FunctionResult(const bool&, FunctionArgs ...)>, FunctionArgs ...)
note: template argument deduction/substitution failed:
note: inconsistent parameter pack deduction with âconst Source&â and âSourceâ
# with clang++
error: no matching member function for call to 'start'
note: candidate template ignored: deduced conflicting types for parameter 'FunctionArgs'
(<const Source&, Population&, const std::vector<Parameter>&, const unsigned long&, const unsigned long&>
vs.
<Source, Population, std::vector<Parameter>, size_t, size_t>)
我的问题是:WTF?
还有:我能做什么?在中显式指定模板参数
start<...>()
电话都没用。。。
我不知道如何让编译器理解它应该看到的“真实”参数类型。。。
这里可以找到一个完全崩溃的最小示例:
https://onlinegdb.com/FtBIGmkH-
编辑
好的,用它来编译:
auto searchThread = start<void, const Source&, Population&, const std::vector<Parameter>&, const size_t&, const size_t&>(
threadedSearch,
source, population,
parameters,
randomCandidatesCount, lineageCount);
谢谢你们,隔离一个最小的例子真的帮了我调试!