当期望T作为模板化参数时,make_tuple将类型T传递为T&&

时间:2016-10-17 20:16:13

标签: c++ tuples point-cloud-library

我正在尝试创建一个类型元组的元组,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)

我很丢失。谢谢。

1 个答案:

答案 0 :(得分:2)

永远不要将make_tuple与明确的模板参数一起使用。

这是我从Microsoft STL维护者那里记得的引用,原因是make_tuple足够聪明,可以删除额外的引用,并明确说明你正在破坏它的目的的模板参数。

另一件事是file.getPCDFileName()Rvalue Reference, 从函数返回的临时值是rvalue。您可以使用本地变量auto filename = file.getPCDFileName(),然后使用make_tuple(file_name, ...