我有一个接收const引用的函数,我需要使用这个引用来调用模板库函数:
std::vector<cv::Size> get_resolutions(const rs2::device& dev)
{
auto sensor = dev.first<rs2::depth_sensor>();
//more code
}
class device
{
public:
template<class T>
T first()
{
for (auto&& s : query_sensors())
{
if (auto t = s.as<T>()) return t;
}
throw rs2::error("Could not find requested sensor type!");
}
//more code
};
当我使用gcc编译时,我收到此错误:
错误:将'const rs2 :: device'作为'this'参数传递丢弃限定符[-fpermissive]
我无法更改first()函数,因为它是外部库的一部分(librealsense,here中的第51行)。 我无法从函数参数dev中删除const,因为这将导致在很多地方删除const正确性。
我可以通过从dev:
中删除const来克服错误auto sensor = const_cast<rs2::device&>(dev).first<rs2::depth_sensor>();
然而,这感觉不好。有没有更正确的方法来处理这个错误?我尝试了以下变化失败:
auto sensor = dev.first<const rs2::depth_sensor>();
auto sensor = const_cast<const rs2::depth_sensor>(dev.first<rs2::depth_sensor>());
但我得到同样的错误。
答案 0 :(得分:4)
我认为有两种可能的解决方案。您允许get_resolutions
通过非const引用获取dev
(尽管可能需要您在调用站点修改代码),或者您自己重新实现first
。
只需替换
std::vector<cv::Size> get_resolutions(const rs2::device& dev)
与
std::vector<cv::Size> get_resolutions(rs2::device& dev)
但是,这也意味着您不能再使用临时对象调用get_resolutions
。
然而,看看source of the library,我真的看不出为什么first()
是非常量的。所有这一切都是调用query_sensors()
( const-qualified,也是公开的),并处理结果: 1
template<class T>
T first()
{
for (auto&& s : query_sensors())
{
if (auto t = s.as<T>()) return t;
}
throw rs2::error("Could not find requested sensor type!");
}
这可能是影响最小的选项:只需在库外部定义一个复制此功能的first()
:
template <class T>
T custom_first(const rs2::device& dev)
{
for (auto&& s : dev.query_sensors())
if (auto t = s.as<T>())
return t;
throw rs2::error("Could not find requested sensor type!");
}
1 提交错误报告的时间可能吗?