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;が、同じエラーが再び発生します。

私は必死になってライブラリ内の1つの問題をデバッグしようとしています。これは、1つのプライベートマップにアクセスしてそれを繰り返すことができれば非常に簡単にデバッグできますが、時間がかかるため、ライブラリ全体をコンパイルできません(そして私はそれを覗き見したい-私はそれが間違っていることを知っていますが、私はこれで一日中苦労しています)

コンパイラは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 に答える