Function mismatch between vectors with identical stored types











up vote
0
down vote

favorite












I have define a template function called "Create2DBBox" just for create bounding boxes from a point cloud vector, the implementation details are less important.



I want to use the template PointT type for accepting different Point type such as PointXYZ or `PointXYZI', the problem is when I define the function like below:
```



template<typename PointT>
std::vector<BBox2D> Create2DBBox(const std::shared_ptr<std::vector<pcl::PointCloud<PointT>, Eigen::aligned_allocator<pcl::PointCloud<PointT> >>> cloudVecIn, const Eigen::MatrixXf& projectMatrix, const cv::Size& imageSize)
{
std::vector<BBox2D> bbox_vec_res;
for(int i = 0; i < cloudVecIn->size(); ++i) {
BBox2D bbox((*cloudVecIn)[i], projectMatrix, imageSize);
bbox_vec_res.push_back(bbox);
}
return bbox_vec_res;
}


When I use this function as below:



 std::shared_ptr<std::vector<pcl::PointCloud<pcl::PointXYZI>>> clustered_vec = ogm_detector_.get_clustered_cloud_vec();
vector<BBox2D> bbox_vec = sensors_fusion::Create2DBBox(clustered_vec, this->transform_matrix_, Size(this->image_raw_.cols, image_raw_.rows));


I get the error:



error: no matching function for call to ‘Create2DBBox(std::shared_ptr<std::vector<pcl::PointCloud<pcl::PointXYZI> > >&, Eigen::MatrixXf&, cv::Size)’
D> bbox_vec = sensors_fusion::Create2DBBox(clustered_vec, this->transform_matrix_, Size(this->image_raw_.cols, image_raw_.rows));


I don't know, and I guess it must be the fisrt template argument cause. Thanks for any help.










share|improve this question









New contributor




Haiming Zhang is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
























    up vote
    0
    down vote

    favorite












    I have define a template function called "Create2DBBox" just for create bounding boxes from a point cloud vector, the implementation details are less important.



    I want to use the template PointT type for accepting different Point type such as PointXYZ or `PointXYZI', the problem is when I define the function like below:
    ```



    template<typename PointT>
    std::vector<BBox2D> Create2DBBox(const std::shared_ptr<std::vector<pcl::PointCloud<PointT>, Eigen::aligned_allocator<pcl::PointCloud<PointT> >>> cloudVecIn, const Eigen::MatrixXf& projectMatrix, const cv::Size& imageSize)
    {
    std::vector<BBox2D> bbox_vec_res;
    for(int i = 0; i < cloudVecIn->size(); ++i) {
    BBox2D bbox((*cloudVecIn)[i], projectMatrix, imageSize);
    bbox_vec_res.push_back(bbox);
    }
    return bbox_vec_res;
    }


    When I use this function as below:



     std::shared_ptr<std::vector<pcl::PointCloud<pcl::PointXYZI>>> clustered_vec = ogm_detector_.get_clustered_cloud_vec();
    vector<BBox2D> bbox_vec = sensors_fusion::Create2DBBox(clustered_vec, this->transform_matrix_, Size(this->image_raw_.cols, image_raw_.rows));


    I get the error:



    error: no matching function for call to ‘Create2DBBox(std::shared_ptr<std::vector<pcl::PointCloud<pcl::PointXYZI> > >&, Eigen::MatrixXf&, cv::Size)’
    D> bbox_vec = sensors_fusion::Create2DBBox(clustered_vec, this->transform_matrix_, Size(this->image_raw_.cols, image_raw_.rows));


    I don't know, and I guess it must be the fisrt template argument cause. Thanks for any help.










    share|improve this question









    New contributor




    Haiming Zhang is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.






















      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      I have define a template function called "Create2DBBox" just for create bounding boxes from a point cloud vector, the implementation details are less important.



      I want to use the template PointT type for accepting different Point type such as PointXYZ or `PointXYZI', the problem is when I define the function like below:
      ```



      template<typename PointT>
      std::vector<BBox2D> Create2DBBox(const std::shared_ptr<std::vector<pcl::PointCloud<PointT>, Eigen::aligned_allocator<pcl::PointCloud<PointT> >>> cloudVecIn, const Eigen::MatrixXf& projectMatrix, const cv::Size& imageSize)
      {
      std::vector<BBox2D> bbox_vec_res;
      for(int i = 0; i < cloudVecIn->size(); ++i) {
      BBox2D bbox((*cloudVecIn)[i], projectMatrix, imageSize);
      bbox_vec_res.push_back(bbox);
      }
      return bbox_vec_res;
      }


      When I use this function as below:



       std::shared_ptr<std::vector<pcl::PointCloud<pcl::PointXYZI>>> clustered_vec = ogm_detector_.get_clustered_cloud_vec();
      vector<BBox2D> bbox_vec = sensors_fusion::Create2DBBox(clustered_vec, this->transform_matrix_, Size(this->image_raw_.cols, image_raw_.rows));


      I get the error:



      error: no matching function for call to ‘Create2DBBox(std::shared_ptr<std::vector<pcl::PointCloud<pcl::PointXYZI> > >&, Eigen::MatrixXf&, cv::Size)’
      D> bbox_vec = sensors_fusion::Create2DBBox(clustered_vec, this->transform_matrix_, Size(this->image_raw_.cols, image_raw_.rows));


      I don't know, and I guess it must be the fisrt template argument cause. Thanks for any help.










      share|improve this question









      New contributor




      Haiming Zhang is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      I have define a template function called "Create2DBBox" just for create bounding boxes from a point cloud vector, the implementation details are less important.



      I want to use the template PointT type for accepting different Point type such as PointXYZ or `PointXYZI', the problem is when I define the function like below:
      ```



      template<typename PointT>
      std::vector<BBox2D> Create2DBBox(const std::shared_ptr<std::vector<pcl::PointCloud<PointT>, Eigen::aligned_allocator<pcl::PointCloud<PointT> >>> cloudVecIn, const Eigen::MatrixXf& projectMatrix, const cv::Size& imageSize)
      {
      std::vector<BBox2D> bbox_vec_res;
      for(int i = 0; i < cloudVecIn->size(); ++i) {
      BBox2D bbox((*cloudVecIn)[i], projectMatrix, imageSize);
      bbox_vec_res.push_back(bbox);
      }
      return bbox_vec_res;
      }


      When I use this function as below:



       std::shared_ptr<std::vector<pcl::PointCloud<pcl::PointXYZI>>> clustered_vec = ogm_detector_.get_clustered_cloud_vec();
      vector<BBox2D> bbox_vec = sensors_fusion::Create2DBBox(clustered_vec, this->transform_matrix_, Size(this->image_raw_.cols, image_raw_.rows));


      I get the error:



      error: no matching function for call to ‘Create2DBBox(std::shared_ptr<std::vector<pcl::PointCloud<pcl::PointXYZI> > >&, Eigen::MatrixXf&, cv::Size)’
      D> bbox_vec = sensors_fusion::Create2DBBox(clustered_vec, this->transform_matrix_, Size(this->image_raw_.cols, image_raw_.rows));


      I don't know, and I guess it must be the fisrt template argument cause. Thanks for any help.







      c++ vector allocator function-templates






      share|improve this question









      New contributor




      Haiming Zhang is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question









      New contributor




      Haiming Zhang is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question








      edited yesterday









      Matthieu Brucher

      4,7481127




      4,7481127






      New contributor




      Haiming Zhang is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked yesterday









      Haiming Zhang

      11




      11




      New contributor




      Haiming Zhang is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      Haiming Zhang is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      Haiming Zhang is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          1
          down vote













          They are not the same, as your function tales a shared pointer to a vector with a custom allocator.



          As your function doesn't depend on the allocator, do:



          template<typename Container>
          std::vector<BBox2D> Create2DBBox(const std::shared_ptr<Container> cloudVecIn, const Eigen::MatrixXf& projectMatrix, const cv::Size& imageSize)


          And even, you don't need the shared pointer, so:



          template<typename Container>
          std::vector<BBox2D> Create2DBBox(const Container& cloudVecIn, const Eigen::MatrixXf& projectMatrix, const cv::Size& imageSize)





          share|improve this answer





















            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });






            Haiming Zhang is a new contributor. Be nice, and check out our Code of Conduct.










             

            draft saved


            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53238388%2ffunction-mismatch-between-vectors-with-identical-stored-types%23new-answer', 'question_page');
            }
            );

            Post as a guest
































            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            1
            down vote













            They are not the same, as your function tales a shared pointer to a vector with a custom allocator.



            As your function doesn't depend on the allocator, do:



            template<typename Container>
            std::vector<BBox2D> Create2DBBox(const std::shared_ptr<Container> cloudVecIn, const Eigen::MatrixXf& projectMatrix, const cv::Size& imageSize)


            And even, you don't need the shared pointer, so:



            template<typename Container>
            std::vector<BBox2D> Create2DBBox(const Container& cloudVecIn, const Eigen::MatrixXf& projectMatrix, const cv::Size& imageSize)





            share|improve this answer

























              up vote
              1
              down vote













              They are not the same, as your function tales a shared pointer to a vector with a custom allocator.



              As your function doesn't depend on the allocator, do:



              template<typename Container>
              std::vector<BBox2D> Create2DBBox(const std::shared_ptr<Container> cloudVecIn, const Eigen::MatrixXf& projectMatrix, const cv::Size& imageSize)


              And even, you don't need the shared pointer, so:



              template<typename Container>
              std::vector<BBox2D> Create2DBBox(const Container& cloudVecIn, const Eigen::MatrixXf& projectMatrix, const cv::Size& imageSize)





              share|improve this answer























                up vote
                1
                down vote










                up vote
                1
                down vote









                They are not the same, as your function tales a shared pointer to a vector with a custom allocator.



                As your function doesn't depend on the allocator, do:



                template<typename Container>
                std::vector<BBox2D> Create2DBBox(const std::shared_ptr<Container> cloudVecIn, const Eigen::MatrixXf& projectMatrix, const cv::Size& imageSize)


                And even, you don't need the shared pointer, so:



                template<typename Container>
                std::vector<BBox2D> Create2DBBox(const Container& cloudVecIn, const Eigen::MatrixXf& projectMatrix, const cv::Size& imageSize)





                share|improve this answer












                They are not the same, as your function tales a shared pointer to a vector with a custom allocator.



                As your function doesn't depend on the allocator, do:



                template<typename Container>
                std::vector<BBox2D> Create2DBBox(const std::shared_ptr<Container> cloudVecIn, const Eigen::MatrixXf& projectMatrix, const cv::Size& imageSize)


                And even, you don't need the shared pointer, so:



                template<typename Container>
                std::vector<BBox2D> Create2DBBox(const Container& cloudVecIn, const Eigen::MatrixXf& projectMatrix, const cv::Size& imageSize)






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered yesterday









                Matthieu Brucher

                4,7481127




                4,7481127






















                    Haiming Zhang is a new contributor. Be nice, and check out our Code of Conduct.










                     

                    draft saved


                    draft discarded


















                    Haiming Zhang is a new contributor. Be nice, and check out our Code of Conduct.













                    Haiming Zhang is a new contributor. Be nice, and check out our Code of Conduct.












                    Haiming Zhang is a new contributor. Be nice, and check out our Code of Conduct.















                     


                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53238388%2ffunction-mismatch-between-vectors-with-identical-stored-types%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest




















































































                    Popular posts from this blog

                    List item for chat from Array inside array React Native

                    Thiostrepton

                    Caerphilly