2012-06-26 7 views
12

संकलित करने में विफल रहा है मैंने बूस्ट :: मल्टी_इंडेक्स के उपयोग की जांच करने के लिए एक विंडोज सी ++ विजुअल स्टूडियो प्रोजेक्ट (वीएस 9) स्थापित किया है। कंटेनर को कस्टम ऑब्जेक्ट, एफसी :: क्लाइंटऑर्डर में साझा पॉइंटर्स को स्टोर करने के लिए सेट किया जा रहा है। परीक्षण के लिए, ऑब्जेक्ट बहुत सरल है, केवल एक स्ट्रिंग और एक चर चर भंडारण। बूस्ट संस्करण 1_46_0सी ++ बूस्ट मल्टी इंडेक्स, संशोधित करने के लिए फंक्शन की आवश्यकता है,

मैंने साझा पॉइंटर पर पहचान के रूप में मल्टी_इंडेक्स कंटेनर को पहचान के रूप में कॉन्फ़िगर किया है, और सदस्य कार्य कार्यों का उपयोग करके दो सदस्य चरों पर भी अनुक्रमणित किया है। यह ठीक लगता है और अच्छी तरह से काम करता है।

हालांकि मुझे संशोधित() विधि में कोई समस्या है। मुझे एहसास है कि मुझे संशोधित() का उपयोग करना है यदि मैं किसी भी सदस्य चर का अद्यतन करना चाहता हूं जो इंडेक्स का हिस्सा हैं। मुझे यह भी एहसास है कि मुझे ढूंढने के लिए पहले कंटेनर में एफसी :: क्लाइंटऑर्डर ऑब्जेक्ट का पता लगाना है, और फिर परिवर्तन करने के लिए इटरेटर को संशोधित करने के लिए पास करें।

यदि मुझे पहचान के माध्यम से एफसी :: क्लाइंटऑर्डर साझा पॉइंटर मिलता है, तो साझा पॉइंटर स्वयं, सबकुछ अच्छी तरह से काम करता है, और संशोधित() खुश है।

यदि मुझे एफसी :: क्लाइंटऑर्डर ने सदस्य फ़ंक्शन, क्लॉर्डिड() (अनिवार्य रूप से इसके आईडी पर ऑर्डर को देखते हुए, बहुत आम उपयोग) के माध्यम से साझा पॉइंटर मिलता है तो संशोधित() फ़ंक्शन विफल रहता है, भले ही वाक्यविन्यास समान है । मुझे एक कंपाइलर त्रुटि मिलती है, जो एक प्रकार की समस्या का संकेत देती है, लेकिन मुझे यह समझना मुश्किल लगता है कि क्या गलत है।

संशोधित() केवल पहचान सूचकांक के आधार पर एक पुनरावर्तक के साथ काम करेगा? यदि ऐसा है, तो इसके क्लॉर्डिड के माध्यम से ऑर्डर को संपादित करने के लिए, मुझे दो लुकअप करना होगा, एक कंटेनर में ऑर्डर ढूंढने के लिए (और इसे स्पॉडर वैरिएबल प्राप्त करें) और एक को स्पॉडर मान के आधार पर एक इटरेटर बनाने के लिए। ऐसा लगता है कि clOrdID() मान के माध्यम से आदेश खींचने में सक्षम होने की वस्तु को हराने के लिए लगता है।

मुझे लगता है कि मैंने गलत समझा है कि संशोधित() फ़ंक्शन की आवश्यकता है। अभी के लिए, मैं डबल लुकअप का उपयोग करके इस पर काम कर सकता हूं, लेकिन अगर किसी के पास कोई समाधान है, तो मैं इसकी सराहना करता हूं। मैं फ़ंक्शंस के लिए बहुत नया हूं इसलिए शायद मुझे गलत समझा गया है कि क्या संशोधित() की ज़रूरत है।

किसी भी मदद के लिए अग्रिम धन्यवाद, इसकी सराहना की जाएगी। नमूना कोड मात्रा का पालन करना चाहिए ...

/////////////////////////////////////////////////////////////////////////////// 
// FILE #1: FCClientOrder.h 
/////////////////////////////////////////////////////////////////////////////// 

#ifndef FCClientOrder_H 
#define FCClientOrder_H 

#include <string>                // Changed to use std::string 

//////////////////////////////////////////////////////////////////////////////// 
// ClientOrder v3: RAM definition of a market order - stripped out for testing 

namespace FC 
{ 

class ClientOrder 
{ 
public: 


    ClientOrder();                // Default Ctor 

    virtual ~ClientOrder();              // Dtor 


    ////////////////////// 
    // ACCESSOR FUNCTIONS 

    std::string clOrdID(void) const;           // Get 
    void clOrdID(const std::string& sClOrdID);         // Set 

    char ordStatus(void) const;             // Get 
    void ordStatus(char cOrdStatus);           // Set 


    /////////////////// 
    // PUBLIC STATICS 

    static void change_status_static(std::tr1::shared_ptr<FC::ClientOrder> spOrder,char cOrdStatus); // Static method to change status 

    // Functor 
    struct change_status_by_sp 
    { 
     change_status_by_sp(char cOrdStatus)           // Ctor 
     : _cOrdStatus(cOrdStatus) 
     {} 

     void operator()(std::tr1::shared_ptr<FC::ClientOrder> spOrder)   // Functor 
     { spOrder->ordStatus(_cOrdStatus); } 

    private: 
     char _cOrdStatus; 
    }; 


private: 

    //////////////////// 
    // PRIVATE MEMBERS 

    std::string     m_sClOrdID;          // Client order ID 
    char      m_cOrdStatus;         // Order Status 

}; // end of class ClientOrder 

} // end of namespace FC 

#endif // FCClientOrder_H 




/////////////////////////////////////////////////////////////////////////////// 
// FILE #2: FCClientOrder.cpp 
/////////////////////////////////////////////////////////////////////////////// 

#include "stdafx.h" 
#include "FCClientOrder.h" 

namespace FC 
{ 

    ClientOrder::ClientOrder() 
    { ordStatus('0'); } 

    ClientOrder::~ClientOrder()              // Dtor 
    {} 

    /////////////////////////////////////////////////////////////////////////// 
    // PUBLIC FUNCTIONS 
    // 

    void ClientOrder::change_status_static(std::tr1::shared_ptr<FC::ClientOrder> spOrder,char cOrdStatus) 
    { spOrder->ordStatus(cOrdStatus); } 


    /////////////////////////////////////////////////////////////////////////// 
    // GET/SET FUNCTIONS 
    // 

    std::string ClientOrder::clOrdID(void) const        // Get Client Order ID 
    { return m_sClOrdID; } 
    void ClientOrder::clOrdID(const std::string& sClOrdID) 
    { m_sClOrdID = sClOrdID; } 

    char ClientOrder::ordStatus(void) const 
    { return m_cOrdStatus; } 
    void ClientOrder::ordStatus(char cOrdStatus) 
    { m_cOrdStatus = cOrdStatus; } 

} // end of namespace FC 





/////////////////////////////////////////////////////////////////////////////// 
// FILE #3: MIC Definition, and member declaration 
/////////////////////////////////////////////////////////////////////////////// 

    typedef std::tr1::shared_ptr<FC::ClientOrder>   spClientOrder; 
    typedef boost::multi_index::multi_index_container 
    < 
     spClientOrder,              // Contained type, shared pointer to ClientOrder 
     boost::multi_index::indexed_by 
     < 
      boost::multi_index::ordered_unique        // 0 index - shared pointer index 
      < 
       boost::multi_index::identity<spClientOrder>, 
       std::less<spClientOrder> 
      > , 
      boost::multi_index::ordered_unique        // 1 index - ClientOrderID 
      < 
       boost::multi_index::const_mem_fun< FC::ClientOrder, std::string, &FC::ClientOrder::clOrdID > 
      > , 
      boost::multi_index::ordered_non_unique       // 2 index - Order Status 
      < 
       boost::multi_index::const_mem_fun< FC::ClientOrder, char, &FC::ClientOrder::ordStatus > , 
       std::less<char> 
      > 
     > 
    > OrderMIC; 





    // Member in working class 
    OrderMic  m_micOrders; 






/////////////////////////////////////////////////////////////////////////////// 
// FILE #4: Utility Functions to update the MIC via .modify() 
/////////////////////////////////////////////////////////////////////////////// 

    bool XMLTestApp::updateOrder(spClientOrder spOrder,char cOrdStatus)     // Order Status is an index, so you must modify via MIC member functions 
    { 
     OrderMIC::nth_index<0>::type& index = m_micOrders.get<0>(); 
     OrderMIC::nth_index<0>::type::iterator i = index.find(spOrder); 
     OrderMIC::nth_index<0>::type::iterator iEnd = index.end(); 
     if (i != iEnd) 
     { 
      // FOUND 
      // i points at the order to change 
      return m_micOrders.modify(i,FC::ClientOrder::change_status_by_sp(cOrdStatus)); 
     } 

     return false; 
    } 


    bool XMLTestApp::updateOrder(const std::string& sClOrdID,char cOrdStatus)     // Order Status is an index, so you must modify via MIC member functions 
    { 
     OrderMIC::nth_index<1>::type& index = m_micOrders.get<1>(); 
     OrderMIC::nth_index<1>::type::iterator i = index.find(sClOrdID); 
     OrderMIC::nth_index<1>::type::iterator iEnd = index.end(); 
     if (i != iEnd) 
     { 
      // FOUND 

      // Option1 - This works, but does another lookup via alternative fn 
      return updateOrder(*i,cOrdStatus);            // <- Works 

      // Option2 - Attempt to use static fn, fails 
      //spClientOrder spOrder = *i; 
      //return m_micOrders.modify(i,FC::ClientOrder::change_status_static(spOrder,cOrdStatus)); 

      // Option3 - Attempt to use *i as spOrder, fails 
      //return m_micOrders.modify(i,FC::ClientOrder::change_status_by_sp(cOrdStatus)); 
     } 

     return false; 
    } 




// FILE #5: Compile Error 

1>------ Build started: Project: XMLTest, Configuration: Debug Win32 ------ 
1>Compiling... 
1>XMLTestApp.cpp 
1>c:\program files\microsoft visual studio\myprojects\xmltest\xmltest\xmltestapp.cpp(931) : error C2664: 'bool boost::multi_index::detail::ordered_index<KeyFromValue,Compare,SuperMeta,TagList,Category>::modify<FC::ClientOrder::change_status_by_sp>(boost::multi_index::detail::bidir_node_iterator<Node>,Modifier)' : cannot convert parameter 1 from 'boost::multi_index::detail::bidir_node_iterator<Node>' to 'boost::multi_index::detail::bidir_node_iterator<Node>' 
1>  with 
1>  [ 
1>   KeyFromValue=boost::multi_index::identity<FC::XMLTestApp::spClientOrder>, 
1>   Compare=std::less<FC::XMLTestApp::spClientOrder>, 
1>   SuperMeta=boost::multi_index::detail::nth_layer<1,FC::XMLTestApp::spClientOrder,boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::identity<FC::XMLTestApp::spClientOrder>,std::less<FC::XMLTestApp::spClientOrder>>,boost::multi_index::ordered_unique<boost::multi_index::const_mem_fun<FC::ClientOrder,std::string,::>>,boost::multi_index::ordered_non_unique<boost::multi_index::const_mem_fun<FC::ClientOrder,char,::;>,std::less<char>>>,std::allocator<FC::XMLTestApp::spClientOrder>>, 
1>   TagList=boost::mpl::vector0<boost::mpl::na>, 
1>   Category=boost::multi_index::detail::ordered_unique_tag, 
1>   Node=boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::index_node_base<FC::XMLTestApp::spClientOrder,std::allocator<FC::XMLTestApp::spClientOrder>>>>>, 
1>   Modifier=FC::ClientOrder::change_status_by_sp 
1>  ] 
1>  and 
1>  [ 
1>   Node=boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::index_node_base<FC::XMLTestApp::spClientOrder,std::allocator<FC::XMLTestApp::spClientOrder>>>> 
1>  ] 
1>  and 
1>  [ 
1>   Node=boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::index_node_base<FC::XMLTestApp::spClientOrder,std::allocator<FC::XMLTestApp::spClientOrder>>>>> 
1>  ] 
1>  No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 
1>Build log was saved at "file://c:\Program Files\Microsoft Visual Studio\MyProjects\XMLTest\XMLTest\Debug\BuildLog.htm" 
1>XMLTest - 1 error(s), 0 warning(s) 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

// (stefaanv द्वारा प्रदान की) समाधान

मैं() को संशोधित m_micOrders के एक सदस्य समारोह के रूप में उपयोग कर रहा था। मैं चाहिए() को संशोधित सूचकांक वस्तु के एक सदस्य समारोह है कि इटरेटर पर लागू होता है, जैसे कि updateOrder() फ़ंक्शन इस तरह देखने के लिए सही किया जाना चाहिए के रूप में उपयोग किया गया है ...

bool XMLTestApp::updateOrder(const std::string& sClOrdID,char cOrdStatus) 
    { 
     OrderMIC::nth_index<1>::type& index = m_micOrders.get<1>(); 
     OrderMIC::nth_index<1>::type::iterator i = index.find(sClOrdID); 
     OrderMIC::nth_index<1>::type::iterator iEnd = index.end(); 
     if (i != iEnd) 
     { 
      // FOUND 
      return index.modify(i,FC::ClientOrder::change_status_by_sp(cOrdStatus)); 
     } 
     return false; 
    } 
+5

मुझे यकीन है कि नहीं कर रहा हूँ, तो मैं जवाब दे नहीं हूँ, लेकिन मेरा अनुमान है कि चूंकि इटरेटर 'सूचकांक पर है (OrderMIC :: nth_index <1> :: प्रकार)' आप शायद 'पर संशोधित करना चाहिए है सूचकांक': 'index.modify (i, एफसी :: क्लाइंटऑर्डर :: change_status_by_sp (cOrdStatus));' (परीक्षण नहीं किया गया) – stefaanv

+2

वाह, हाँ, यही है, आपको इस तरह इंडेक्स ऑब्जेक्ट का उपयोग करना होगा ... "वापसी सूचकांक .modify (i, एफसी :: क्लाइंटऑर्डर :: change_status_by_sp (cOrdStatus)); ", कंटेनर m_micOrders का उपयोग करने के विरोध में। क्या आप क्रेडिट पाने के लिए उत्तर के रूप में पोस्ट करना चाहते हैं? बहुत बहुत धन्यवाद, यह वास्तव में मुझे प्रबुद्ध कर दिया है, मैं देख सकता हूं कि अन्य विधियां समान रूप से काम करने जा रही हैं। –

+0

और अब मैं देख सकता हूं कि कामकाजी फ़ंक्शन में m_micOrders का उपयोग केवल काम किया क्योंकि यह पहचान का उपयोग कर रहा है, आइटम शामिल हैं। अब सब बहुत अधिक समझ में आता है। यह मेरा दिन बना दिया है, धन्यवाद StefaanV। –

उत्तर

0

(समाधान प्रदान की । stefaanv मूल प्रश्न से नकल से मैं इस सुन रखा ताकि सवाल अब के रूप में अनुत्तरित दिखाई नहीं देता @Steve Hibbert:। एक और जवाब के रूप में यह अपने आप को कॉपी फिर और इसे स्वीकार करने के लिए स्वतंत्र महसूस)

modify() को m_micOrders के सदस्य फ़ंक्शन के रूप में उपयोग किया गया था। इसके बजाए, modify() इंडेक्स ऑब्जेक्ट के सदस्य फ़ंक्शन के रूप में उपयोग किया जाना चाहिए था, जिस पर इटरेटर लागू होता है, जैसे updateOrder() फ़ंक्शंस को इस तरह दिखने के लिए सही किया जाना चाहिए ...

bool XMLTestApp::updateOrder(const std::string& sClOrdID,char cOrdStatus) 
    { 
     OrderMIC::nth_index<1>::type& index = m_micOrders.get<1>(); 
     OrderMIC::nth_index<1>::type::iterator i = index.find(sClOrdID); 
     OrderMIC::nth_index<1>::type::iterator iEnd = index.end(); 
     if (i != iEnd) 
     { 
      // FOUND 
      return index.modify(i,FC::ClientOrder::change_status_by_sp(cOrdStatus)); 
     } 
     return false; 
    } 
संबंधित मुद्दे