2016-03-23 41 views
1

Şimdi PCL (Point Cloud Library) ile C++ şablonunu ele alıyorum ve çözemediğim bir şeyle karşılaştım (daha önce internette ve Stack'da aradım)C++ Şablon - Geçerli bir dönüşüm hatası yok

Features adında bir şablon sınıfım var.

benim hpp dosyası: cpp dosyasında

#ifndef KeyFeatures_hpp 
#define KeyFeatures_hpp 

// Declarations and includes 

typedef pcl::PointXYZRGB PointTypeRGB; 
template<typename FeatureType> 
class Features { 

public: 
    Features(const int typeDescriptor); 

void setDescriptorExtractor(typename pcl::Feature<PointTypeRGB, FeatureType>::Ptr extractor); 

private: 
    typename pcl::Feature<PointTypeRGB, FeatureType>::Ptr m_descriptor_extractor; 


}; 

#endif /* Features_hpp */ 

ben tip ne tür olacak onu ve daha sonra bazı eylemi gerçekleştirmek çekleri bir kurucuya sahip. Benim değişken üyesi doldurmak için başarılı olamadı çalıştığınızda

template <typename FeatureType> 
Features<FeatureType>::Features(const int type){ 
     //Some code 

if (type == DESCRIPTOR_SHOT){ 
    pcl::SHOTEstimationOMP<PointTypeRGB, pcl::Normal, pcl::SHOT352>* shot = new pcl::SHOTEstimationOMP<PointTypeRGB, pcl::Normal, pcl::SHOT352>; 
    shot->setRadiusSearch (0.02f); 

    pcl::Feature<PointTypeRGB, pcl::SHOT352>::Ptr descriptor_extractor (shot); 
    descriptor_extractor->setSearchMethod (pcl::search::Search<PointTypeRGB>::Ptr (new pcl::search::KdTree<PointTypeRGB>)); 

    this->m_descriptor_extractor = descriptor_extractor;//ERROR 
    setDescriptorExtractor(descriptor_extractor);//ERROR 

     // Some code 
} 

hata

son iki hatlarında ortaya çıktı. Her zaman aşağıdaki hata x 10 Ancak ben bütün şablon sınıfı koymak benim cpp dosyanın sonuna

error: no matching conversion for functional-style cast from 'const shared_ptr<pcl::Feature<pcl::PointXYZRGB, pcl::SHOT352> >' 
to 'this_type' (aka 'shared_ptr<pcl::Feature<pcl::PointXYZRGB, pcl::ShapeContext1980> >') 

(türünde yapılmış 10 çeşit karşılık gelir) var. Örneğin:

template class Features<pcl::SHOT352>; 

benim ana işlevinde ben kullanarak bu sınıfı seslendi:

Features<pcl::SHOT352> feature_SHOT(type); 

O dönüştürme işlemi mümkün değil gibi görünüyor ..

birisi mümkün olabilir Can bana yardım et ?

cevap

1

Teşekkür Görünüşe Features<pcl::ShapeContext1980> yüzden onun m_descriptor_extractorshared_ptr<pcl::Feature<pcl::PointXYZRGB, pcl::ShapeContext1980>> olan tip pcl::Feature<pcl::PointXYZRGB, pcl::ShapeContext1980>::Ptr sahiptir başlatmasını edilmektedir.

Ancak kurucunun içinde hala pcl::Feature<pcl::PointXYZRGB, pcl::SHOT352>::Ptr, yani shared_ptr<pcl::Feature<pcl::PointXYZRGB, pcl::SHOT352>> kullanıyorsunuz - tamamen farklı bir tür. Ve you generally don't implement templates in .cpp files numaralı bir not olarak

+0

Kodumu düzenledim. Feature nesneyi belirli bir türle oluşturdum (burada SHOT one), bu yüzden neden 10 tane diğer tanımlayıcımın 10 kez yanlış olduğunu anlayamıyorum. Şablonla ilgili olarak, bunu yaptım çünkü aksi halde hpp dosyam çok büyük olacak ... Ve ben de temiz tutmak istedim. – lilouch

+0

Çünkü 10 diğer tanıtıcıda da aynı şeyi (yanlış belirli türde) yapıyorsunuz. –

+0

Ancak, nesnemi oluşturduğumda, bu şekilde KeyFeatures feature_SHOT (type); Yani burada tür iyi belirtilmiş ve bu nedenle benim kurucumda uygun tip no oluşturulmalıdır? – lilouch

0

İlk olarak, resmi terim bir "sınıf şablonu" - sınıflar oluşturmak için bir şablondur.

Features<pcl::ShapeContext1980> adlı bir sınıf oluşturmuş görünüyorsunuz.

Bu tip shared_ptr<pcl::Feature<pcl::PointXYZRGB, pcl::ShapeContext1980> >

Sen buna bir shared_ptr<pcl::Feature<pcl::PointXYZRGB, pcl::SHOT352>> atamaya çalışıyorsunuz arasında m_descriptor_extractor sahiptir.

Bunlar, birbiriyle ilgisiz türlerdir, bu nedenle derleme zamanında başarısız olur.

+0

No çalışmıyor, ben Özellikler örneğini etmedi ben sadece CPP dosyamın sonunda bulunan şablon şablonunu çağır. – lilouch

+0

Tamam. Bir tane görmemiz gerek. Derleyicinizde ciddi bir hata var ya da özelliklerini yarattınız. Sonunda bahse girerim. Bir satırınız var 'template class Özellikler ;'? Bu onu örneklendirir. Benim Özellikler cpp dosyanın sonuna –

+0

Evet şablon olarak adlandırılan sınıf Özellikleri ve toplamda her tür (Yaklaşık 10) için! – lilouch

İlgili konular