【发布时间】:2018-01-30 01:44:05
【问题描述】:
我正在与编译器及其使用自动模板推导的能力作斗争。以下不编译,模板自动推演失败:
template<typename Configuration, typename ConfigAlloc = std::allocator<Configuration>>
std::vector<Configuration, ConfigAlloc> ResamplePath(
const std::vector<Configuration, ConfigAlloc>& path,
const double resampled_state_distance,
const std::function<double(const Configuration&, const Configuration&)>& state_distance_fn,
const std::function<Configuration(const Configuration&, const Configuration&, const double)>& state_interpolation_fn)
{
...
}
void foo()
{
std::vector<Eigen::Vector3d, Eigen::aligned_allocator<Eigen::Vector3d>> path;
...
const auto interpolation_fn = [&] (
const Eigen::Vector3d& prev,
const Eigen::Vector3d& curr,
const double ratio)
{
Eigen::Vector3d interpolated;
...
return interpolated;
};
auto resample_result = ResamplePath(path, ..., interpolation_fn);
}
如果我将 lambda 声明更改为
const std::function<Eigen::Vector3d(const Eigen::Vector3d&, const Eigen::Vector3d&, const double)> interpolation_fn = [&] (
const Eigen::Vector3d& prev,
const Eigen::Vector3d& curr,
const double ratio)
{
Eigen::Vector3d interpolated;
...
return interpolated;
};
或者我更改函数调用以显式定义类型
auto resample_result = ResamplePath<Eigen::Vector3d, Eigen::aligned_allocator<Eigen::Vector3d>>(
path, ..., interpolation_fn);
然后一切编译没有任何问题。
我是否遗漏了一些可能允许自动推导在不明确定义 lambda 类型的情况下工作的东西?
编辑:准确的编译错误
virtual_rubber_band.cpp: In member function ‘void smmap::VirtualRubberBand::resampleBand(bool)’:
virtual_rubber_band.cpp:279:111: error: no matching function for call to ‘ResamplePath(EigenHelpers::VectorVector3d&, const double&, const smmap::VirtualRubberBand::resampleBand(bool)::<lambda(const Vector3d&, const Vector3d&)>&, const smmap::VirtualRubberBand::resampleBand(bool)::<lambda(const Vector3d&, const Vector3d&, double)>&)’
band_, max_distance_between_rubber_band_points_, state_distance_fn, state_interpolation_fn);
In file included from virtual_rubber_band.cpp:3:0:
shortcut_smoothing.hpp:191:52: note: candidate: template<class Configuration, class ConfigAlloc> std::vector<_Tp, _Alloc> shortcut_smoothing::ResamplePath(const std::vector<_Tp, _Alloc>&, double, const std::function<double(const Datatype&, const Datatype&)>&, const std::function<Configuration(const Configuration&, const Configuration&, double)>&)
inline std::vector<Configuration, ConfigAlloc> ResamplePath(
^
shortcut_smoothing.hpp:191:52: note: template argument deduction/substitution failed:
virtual_rubber_band.cpp:279:111: note: ‘const smmap::VirtualRubberBand::resampleBand(bool)::<lambda(const Vector3d&, const Vector3d&)>’ is not derived from ‘const std::function<double(const Datatype&, const Datatype&)>’
band_, max_distance_between_rubber_band_points_, state_distance_fn, state_interpolation_fn);
【问题讨论】:
-
»以下无法编译,模板自动推演失败«这是一个必须猜错的游戏吗?
-
寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误和在问题本身中重现它所需的最短代码。没有明确的问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example。
-
我试图创建一个最小的、完整的、可验证的示例,但是这样的示例很难创建,因为它们位于不同的库中;我能够创建的最小示例是大约 2000 行代码。我正在按要求添加确切的编译错误。
标签: c++ c++11 templates lambda g++