vendredi 19 août 2016

compilation Error in using base class pointer with a derived template class

I am trying to compile following code and getting error as no matching function. what wrong am i doing?

namespace lim {

using ObjectsWithExecutors  = std::vector<std::pair<lim::MoBaseCPtr, lim::ExecutorPtr>>;

struct SubscriptionId;
struct MoTypeChanges;
class ImView
{
public:
    using Subscriber = std::function<void (const ClientUpdateNotifications&)>;
    virtual ~ImView() {}

    /**
     * @brief Commits object changes to storage.
     * @param updatedObjects is collection of objects to be created and/or updated.
     * @return false if commit failed.
     */     
    virtual bool commit(const lim::MoBaseCPtrVec& updatedObjects, const lim::DistNameVec& deletedDistNames) = 0;

    /**
     * @brief Commits object changes to storage and registers executors (for newly created objects).
     * @note This commit variant will be kept until command pattern replaces all info model 
     * operations (aka removal of executors).
     * @return false if commit failed.
     */    
    virtual bool commit(const lim::ObjectsWithExecutors& createdMos, const lim::MoBaseCPtrVec& updatedObjects,
        const lim::DistNameVec& deletedDistNames) = 0;


};

using ImViewPtr = std::shared_ptr<lim::ImView>;
namespace storage {
class DistName;
class MoBase;
using MoBasePtr = boost::shared_ptr<MoBase>;
using MoBaseCPtr = boost::shared_ptr<const MoBase>;
using MoBasePtrSet = std::set<MoBasePtr>;
using MoBaseCPtrSet = std::set<MoBaseCPtr>;

using MoBasePtrVec = std::vector<MoBasePtr>;
using MoBaseCPtrVec = std::vector<MoBaseCPtr>

class __attribute__((visibility("default"))) MoBase {
public:
    MoBase(const DistName& dn) : distName(dn) {}
    virtual ~MoBase() {}
private:
    const DistName distName;
}
}
template <typename DataType>
class __attribute__((visibility("default"))) MoBaseT : public storage::MoBase
{
public:
    explicit MoBaseT(const DistName& dn)
    : storage::MoBase(dn)
    , m_data()
    {
        validate(dn);
    }
};

class GTS;
typedef MoBaseT<GTS> MoGts;
}



int main(){   
   lim::DistName gtsDn(std::string "/abc")
   auto gtsMo = std::make_shared<lim::MoGts>(gtsDn);                                           

   lim::ExecutorPtr execPtr;

    std::vector<std::pair<lim::MoBaseCPtr, lim::ExecutorPtr>> objects (1);
    objects.push_back(std::make_pair(gtsMo, execPtr));

    bool commitResult = imView_->commit(objects, {}, {});
    if (commitResult)
    {
        std::cout << "successfully committed gts mo" << std::endl;
    }

}

Error was as below **> error: no matching function for call to >'std::vector, >boost::shared_ptr > >::push_back(std::pair >, >boost::shared_ptr >)'objects.push_back(std::make_pair(gtsMo, execPtr));

bits/stl_vector.h:913:7: note: candidate: void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = std::pair, boost::shared_ptr >; _Alloc = std::allocator, boost::shared_ptr > >; std::vector<_Tp, _Alloc>::value_type = std::pair, boost::shared_ptr >] push_back(const value_type& __x) bits/stl_vector.h:913:7: note: no known conversion for argument 1 from 'std::pair >, boo st::shared_ptr >' to 'const value_type& {aka const std::pair, boost::shared_ ptr >&}' bits/stl_vector.h:931:7: note: candidate: void std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = std::pair, boost::shared_ptr >; _Alloc = std::allocator, boost::shared_ptr > >; std::vector<_Tp, _Alloc>::value_type = std::pair, boost::shared_ptr >] push_back(value_type&& __x) bits/stl_vector.h:931:7: note: no known conversion for argument 1 from 'std::pair >, boo st::shared_ptr >' to 'std::vector, boost::shared_ptr > >::value_type&& {aka std::pair, boost::shared_ptr >&&}' make[3]: * [src/imMgr/CMakeFiles/http://ift.tt/2bHHjzv] Error 1 make[2]: * [src/imMgr/CMakeFiles/GTS-ImMgr.dir/all] Error 2 **

Aucun commentaire:

Enregistrer un commentaire