0

我在调用专用模板函数时遇到问题。

我的代码是这样的:

namespace{
    struct Y {};
}

template<>
bool pcl::visualization::PCLVisualizer::addPointCloud<Y>(const typename pcl::PointCloud< Y >::ConstPtr &cloud, const std::string &id, int viewport);

呼叫地点是:

pcl::PointCloud<Y>::Ptr cloud(new pcl::PointCloud<Y>);
visualizer->addPointCloud(cloud, "cloud", 0);

我得到的错误是

'bool pcl::visualization::PCLVisualizer::addPointCloud(const boost::shared_ptr<T> &,const std::string &,int)' : cannot convert parameter 1 from 'boost::shared_ptr<T>' to 'const boost::shared_ptr<T> &'

以下是库中的一些声明和 typedef:

typedef boost::shared_ptr<PointCloud<PointT> > Ptr;
typedef boost::shared_ptr<const PointCloud<PointT> > ConstPtr;

template <typename PointT> bool pcl::visualization::PCLVisualizer::addPointCloud(
    const typename pcl::PointCloud<PointT>::ConstPtr &cloud,
    const std::string &id, int viewport
)

我已经尝试过boost::shared_ptr<const pcl::PointCloud<Y> > cloud;,但同样的错误再次出现。

我正在拼命尝试调试库中的一个问题,如果我可以访问一个私有地图并遍历它,这将非常容易调试,但我无法编译整个库,因为这需要一些时间(我只是想看看它——我知道这是错的,但我整天都在为此苦苦挣扎)

编译器是VC++ 10。

谢谢

4

3 回答 3

2

显然T,它出现在错误消息中的两次都不相同。

具体来说,由于您的标头使用ConstPtr并且您的调用方代码使用Ptr,我怀疑一个是shared_ptr<Object>,另一个是shared_ptr<const Object>。然后出现错误,因为这些类型不相关。

于 2012-12-13T20:14:53.183 回答
0
#include <string>
#include <memory>

namespace{
    struct Y {};
}

template<typename T>
struct PointCloud {
  typedef std::shared_ptr<PointCloud<T>> Ptr;
  typedef std::shared_ptr<const PointCloud<T>> ConstPtr;
};

template<typename T>
void addPointCloud(typename PointCloud<T>::ConstPtr const &cloud) {}

int main() {
  PointCloud<Y>::Ptr cloud(new PointCloud<Y>());
  addPointCloud<Y>( cloud );
}

上面的代码运行良好。因此,无论您的问题是什么,它都不在您向我们展示的代码中。

于 2012-12-13T20:33:41.447 回答
0

首先,谢谢大家回答我这个问题。Ben Voigt 帮助指导我查看模板参数,而不是实际的类型转换错误消息,并帮助 Yakk 写下他的代码。

与此同时,我试图将我的代码分解成一个简单的函数,这一次对我产生了不同的错误!

#include <iostream>
#include <memory>


template<typename PointT>
class PointCloud
{
public:
    typedef std::shared_ptr<PointCloud<PointT> > Ptr;
    typedef std::shared_ptr<const PointCloud<PointT> > ConstPtr;

};


class PCLVisualizer
{
    public:
        template<typename PointT>
        bool addPointCloud(
            const typename PointCloud<PointT>::ConstPtr &cloud,
            const std::string &id, int viewport
        ){}
};

namespace{
    struct Y {};
}

template<>
bool PCLVisualizer::addPointCloud<Y>(const typename PointCloud< Y >::ConstPtr &cloud, const std::string &id, int viewport)
{
    return true;
}

int main()
{
    PCLVisualizer p;
    PointCloud<Y>::Ptr cloud(new PointCloud<Y>());
    p.addPointCloud(cloud, "cloud", 0); 
}

现在的错误是:

error C2783: 'bool PCLVisualizer::addPointCloud(const PointCloud<PointT>::ConstPtr &,const std::string &,int)' : could not deduce template argument for 'PointT'     

所以,我现在看到了我首先需要做的事情(我要出去拍摄自己,因为我现在感觉不太聪明:)):

getVisualizer()->addPointCloud<Y>(cloud, "cloud", 0);

再次感谢大家!

于 2012-12-13T20:52:11.560 回答