我有一个接收常量引用的函数,并且我需要使用这个引用调用一个模板库函数:
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)的一部分(第51行here)。 我不能从函数参数dev中删除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>());
但是我使用它们时也出现了相同的错误。
rs2::device
对象放入一个std::shared_ptr
(或者可能是 unique_ptr)中,将其存储在包装对象内,并使您的包装对象成为其外观。指定您的外观方法的 const-ness,以便将其转发到rs2::device
方法。您的外观的template<class T> T first() const
将没有问题解引用包装的const
std::shared_ptr,然后调用包装对象中的真实方法。 - Sam Varshavchikfirst
是否会改变对象。常量正确性的整个重点在于它必须是...正确的 ;) - UKMonkeyconst
,因为唯一的其他可能修改操作是调用query_sensors
,但它本身是const
。如果是这种情况,请立即使用const_cast
,因为将来可能会进行适应,但您确定此转换永远不会导致 UB。但如果这是意图,请像 @UKMonkey 所说的那样或将函数拆分为const
和mutable
部分。 - Jodocus