Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++11]wrapper e forwarding in c++ 11

    ciao.
    Devo realizzare un semplice Wrapper per aggiungere una funzione a dei tipi:
    codice:
    template< typename T>
    class Wrapper : public T
    {
    public:
        void funcInserita(){};
    };
    in pratica se ho una classe IfcData faccio:
    typedef Wrapper<IfcData> Ex_ifcdata
    e il tipo Ex_ifcdata ha tutte le caratteristiche di IfcData piu la funzione, o sbaglio?

    ora, passando alla domanda:
    i tipi creati in questo modo sono 2000, e io non posso inserire in overload tutti i tipi di costruttore , percio' ho pensato ad un costruttore con i variadic template e il forwarding, ma ancora non sono riuscito.

    poi ho un dubbio: se un tipo del costruttore è un puntatore come mi devo comportare?

    grazie.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: [c++11]wrapper e forwarding in c++ 11

    Originariamente inviato da giuseppe500
    e il tipo Ex_ifcdata ha tutte le caratteristiche di IfcData piu la funzione, o sbaglio?
    Ni. Nel senso che erediti dati e funzioni membro ma non costruttori di copia e/o operatore di assegnamento che andranno definiti per la classe derivata (sono comunque banali).

    i tipi creati in questo modo sono 2000, e io non posso inserire in overload tutti i tipi di costruttore , percio' ho pensato ad un costruttore con i variadic template e il forwarding, ma ancora non sono riuscito.
    Se usi VC++ occhio che funziona solo con VC2012 November CTP e superiori.
    Con una versione più vecchia devi scriverti i vari costruttori a mano (che non sono 2000, ma quelli che ti servono per passare un numero N di parametri).
    codice:
    template< typename T>
    class Wrapper : public T
    {
    public:
        template <class... Args>
        Wrapper(Args&&... args) : T(std::forward<Args>(args)...) {}   
     
        void funcInserita(){};
    };
    poi ho un dubbio: se un tipo del costruttore è un puntatore come mi devo comportare?
    La documentazione della libreria dovrebbe spiegare chi gestisce il lifetime del puntatore.
    Comunque per il costruttore è un dato come gli altri.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    emm... Shodan ho un dubbio, i tipi all'interno delle classi si possono ereditare anc'essi?
    poi ti chiedo un consiglio su di un libro sui template, che parta quasi da zero(ma non in modo banale come la serie for dummies) , ma che sia fatto bene.
    ciao.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    inoltre ottengo una serie di questi errori:
    Error 1 error C2440: 'initializing' : cannot convert from 'ifcXML::IFC2x3::FINAL::base_IfcOrganization *' to 'ifcXML::IFC2x3::FINAL::base_IfcActorSelect::IfcOr ganization_type *' c:\ifc\codesynthesis xsd 3.3\include\xsd\cxx\tree\containers.txx 180 dllIfc (Visual Studio 2010) 1

    e l'errore C2440 è documentato da microsoft qui:
    qui

    il link li parla di aggiungere una funzione statica che ritorna la classe per metterci una pezza!
    e dice che questo tipo di errore puo' essere causato da un forwarding e non ho capito perchè.
    ma non ho capito bene come risolvere , dato che ho moltissime classi e non ho accesso al generatore delle classi c++.

    questa è la funzione dove mi manda l'errore
    codice:
          template <typename T>
          void optional<T, false>::
          set (const T& x)
          {
            // We always do a fresh copy because T may not be x's
            // dynamic type.
            //
            T* r (x._clone (flags_, container_));//ERRRORE ERRORE ERRORE
    
            delete x_;
            x_ = r;
          }
    se mi aitutate vi ringrazio.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da giuseppe500
    emm... Shodan ho un dubbio, i tipi all'interno delle classi si possono ereditare anc'essi?
    Ovvio, secondo le regole di ereditarietà.

    poi ti chiedo un consiglio su di un libro sui template, che parta quasi da zero(ma non in modo banale come la serie for dummies) , ma che sia fatto bene.
    ciao.
    Le basi le ho imparate dal libro di Eckel, studiando il codice di Boost e blog vari.
    Mi spiace, ma non ho titoli da darti.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da giuseppe500
    inoltre ottengo una serie di questi errori:
    Error 1 error C2440: 'initializing' : cannot convert from 'ifcXML::IFC2x3::FINAL::base_IfcOrganization *' to 'ifcXML::IFC2x3::FINAL::base_IfcActorSelect::IfcOr ganization_type *' c:\ifc\codesynthesis xsd 3.3\include\xsd\cxx\tree\containers.txx 180 dllIfc (Visual Studio 2010) 1

    e l'errore C2440 è documentato da microsoft qui:
    qui
    The compiler cannot cast from 'type1' to 'type2'.
    Ergo i due tipi non sono relazionabili.
    Dai nomi presumo che IfcOrganization_type sia ereditata da base_IfcOrganization , per cui stai tentando di assegnare un puntatore a classe base ad un puntatore a classe derivata e questo non lo puoi fare senza un cast specifico.
    Puoi scegliere tra static_cast<> e dynamic_cast<> tenendo presente che solo con il secondo puoi gestire un eventuale errore di conversione.
    Se poi tutto fila liscio puoi passare al primo.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    ho risolto questo problema, adesso semre sul forwarding ne ho un altro:
    gli auto_ptr<>
    codice:
    Error	1	error C2664: 'ifcXML::IFC2x3::FINAL::base_IfcCompositeCurve::base_IfcCompositeCurve(const ifcXML::IFC2x3::FINAL::base_IfcCompositeCurve &,xml_schema::flags,xsd::cxx::tree::_type *)' : cannot convert parameter 2 from 'const std::auto_ptr<ifcXML::IFC2x3::FINAL::base_IfcCompositeCurve::Segments_type>' to 'const ifcXML::IFC2x3::FINAL::base_IfcCompositeCurve::Segments_type &'	c:\ifc\dllifc\ifc\ifc2x3.hxx	93	dllIfc (Microsoft Visual C++ Compiler Nov 2012 CTP)	1
    ho un costruttore del tipo:
    codice:
    void
    Segments (::std::auto_ptr< Segments_type > p);
    [code]
    riporto una parte della classe, magari potrebbe essere utile:
    codice:
    class IFC_EXP base_IfcCompositeCurve: public ::ifcXML::IFC2x3::FINAL::IfcBoundedCurve
          {
            public:
            // Segments
            // 
            typedef ::ifcXML::IFC2x3::FINAL::Segments Segments_type;
            typedef ::xsd::cxx::tree::traits< Segments_type, char > Segments_traits;
    
            const Segments_type&
            Segments () const;
    
            Segments_type&
            Segments ();
    
            void
            Segments (const Segments_type& x);
    
            void
            Segments (::std::auto_ptr< Segments_type > p);
    l'::std::auto_ptr è un template potrebbe essere quello che da il problema?
    posso sistemare in qualche modo?
    o non ho centrato il problema?

    grazie.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    ho risolto questo problema, adesso semre sul forwarding ne ho un altro:
    gli auto_ptr<>
    codice:
    Error	1	error C2664: 'ifcXML::IFC2x3::FINAL::base_IfcCompositeCurve::base_IfcCompositeCurve(const ifcXML::IFC2x3::FINAL::base_IfcCompositeCurve &,xml_schema::flags,xsd::cxx::tree::_type *)' : cannot convert parameter 2 from 'const std::auto_ptr<ifcXML::IFC2x3::FINAL::base_IfcCompositeCurve::Segments_type>' to 'const ifcXML::IFC2x3::FINAL::base_IfcCompositeCurve::Segments_type &'	c:\ifc\dllifc\ifc\ifc2x3.hxx	93	dllIfc (Microsoft Visual C++ Compiler Nov 2012 CTP)	1
    ho un costruttore del tipo:
    [code]
    void
    Segments (::std::auto_ptr< Segments_type > p);
    [code]
    riporto una parte della classe, magari potrebbe essere utile:
    codice:
    class IFC_EXP base_IfcCompositeCurve: public ::ifcXML::IFC2x3::FINAL::IfcBoundedCurve
          {
            public:
            // Segments
            // 
            typedef ::ifcXML::IFC2x3::FINAL::Segments Segments_type;
            typedef ::xsd::cxx::tree::traits< Segments_type, char > Segments_traits;
    
            const Segments_type&
            Segments () const;
    
            Segments_type&
            Segments ();
    
            void
            Segments (const Segments_type& x);
    
            void
            Segments (::std::auto_ptr< Segments_type > p);
    l'::std::auto_ptr è un template potrebbe essere quello che da il problema?
    posso sistemare in qualche modo?
    o non ho centrato il problema?

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    con il perfect forwarding ottengo questo errore:
    Error 2 error C2974: 'std::forward' : invalid template argument for '_Ty', type expected c:\ifc\dllifc\ifc\ifc2x3.hxx 203 dllIfc (Microsoft Visual C++ Compiler Nov 2012 CTP) 1

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.