我正在尝试创建一个类型元组的元组,pcl :: visualization :: PointCloudColorHandler>但是当我将相应类型的参数传递给std :: make_tuple时,它表示作为pcl :: PointCloud传递的参数实际上是pcl :: PointCloud&&,如果我是正确的则是rvalue引用。我不明白pcl :: PointCloud类型如何成为右值引用。这是代码:
pcl::PointCloud<pcl::PointXYZRGB> cloud;
pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr constCloud(&cloud);
pcl::io::loadPCDFile<pcl::PointXYZRGB>(file.getPCDFilePath().string(), cloud);
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgbHandler(constCloud);
associatedClouds.insert(std::make_tuple<std::string, pcl::PointCloud<pcl::PointXYZRGB>, pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> >(file.getPCDFileName(), cloud, rgbHandler));
visualizedFiles.push_back(cloud);
我得到的错误是:
/Users/wfehrnstrom/CmakeTest/map.cpp:53:29: error: no matching function for call to 'make_tuple'
associatedClouds.insert(std::make_tuple<std::string, pcl::PointCloud<pcl::PointXYZRGB>, pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> >(file.getPCDFileName(), cloud, rgbHandler));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/tuple:868:1: note: candidate function [with _Tp = <std::__1::basic_string<char>, pcl::PointCloud<pcl::PointXYZRGB>, pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB>>] not viable: no known conversion from 'pcl::PointCloud<pcl::PointXYZRGB>' to 'pcl::PointCloud<pcl::PointXYZRGB> &&' for 2nd argument
make_tuple(_Tp&&... __t)
我很丢失。谢谢。
答案 0 :(得分:2)
永远不要将make_tuple
与明确的模板参数一起使用。
这是我从Microsoft STL维护者那里记得的引用,原因是make_tuple
足够聪明,可以删除额外的引用,并明确说明你正在破坏它的目的的模板参数。
另一件事是file.getPCDFileName()
是Rvalue Reference
,
从函数返回的临时值是rvalue。您可以使用本地变量auto filename = file.getPCDFileName()
,然后使用make_tuple(file_name, ...
。