Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C++] Errore con std::pair<const std::string, void*>

    Salve a tutti, scusate il titolo, ma non saprei proprio come intitolare il problema. Spero di non richiedere cosa già chieste... premetto ho cercato su google e anche nel forum, ma non ho trovato nessuna soluzione
    Ad ogni modo ho questo codice
    codice:
    std::map<std::string, IUIWidget*> __m_Widgets; // Questo è nel'header :3
    
    void CUI::AttachWidget( IUIWidget* widget )
    {
        __m_Widgets.insert( std::make_pair(widget->GetID(), widget)  ); // Errore qui!
    }
    se provo a inserire così qualcosa ottengo questo dal compilatore:
    codice:
    6>c:\Program Files\Microsoft Visual Studio 10.0\VC\include\utility(216): error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const std::string' (or there is no acceptable conversion)
    6>          c:\Program Files\Microsoft Visual Studio 10.0\VC\include\xstring(707): could be 'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(std::basic_string<_Elem,_Traits,_Ax> &&)'
    6>          with
    6>          [
    6>              _Elem=char,
    6>              _Traits=std::char_traits<char>,
    6>              _Ax=std::allocator<char>
    6>          ]
    6>          c:\Program Files\Microsoft Visual Studio 10.0\VC\include\xstring(762): or       'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(const std::basic_string<_Elem,_Traits,_Ax> &)'
    6>          with
    6>          [
    6>              _Elem=char,
    6>              _Traits=std::char_traits<char>,
    6>              _Ax=std::allocator<char>
    6>          ]
    6>          c:\Program Files\Microsoft Visual Studio 10.0\VC\include\xstring(767): or       'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(const _Elem *)'
    6>          with
    6>          [
    6>              _Elem=char,
    6>              _Traits=std::char_traits<char>,
    6>              _Ax=std::allocator<char>
    6>          ]
    6>          c:\Program Files\Microsoft Visual Studio 10.0\VC\include\xstring(772): or       'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(_Elem)'
    6>          with
    6>          [
    6>              _Elem=char,
    6>              _Traits=std::char_traits<char>,
    6>              _Ax=std::allocator<char>
    6>          ]
    6>          while trying to match the argument list '(const std::string, const std::string)'
    6>          c:\Program Files\Microsoft Visual Studio 10.0\VC\include\utility(215) : while compiling class template member function 'std::pair<_Ty1,_Ty2> &std::pair<_Ty1,_Ty2>::operator =(const std::pair<_Ty1,_Ty2> &)'
    6>          with
    6>          [
    6>              _Ty1=const std::string,
    6>              _Ty2=ProtonEngine::IUIWidget *
    6>          ]
    6>          ..\..\Source\Engine\UI.cpp(15) : see reference to class template instantiation 'std::pair<_Ty1,_Ty2>' being compiled
    6>          with
    6>          [
    6>              _Ty1=const std::string,
    6>              _Ty2=ProtonEngine::IUIWidget *
    6>          ]
    Il problema è essenzialmente che non riesco a inizializzare il pair della map, perchè il primo valore, quello della chiave è per forza const...

    Ora la cosa che mi manda ai pazzi è che un codice identico, ma in un'altra classe, funziona alla perfezione... Che cosa potrebbe essere? Come posso risolverlo? grazie mille in anticipo ;-)

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Codice identico? Mostralo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    codice:
    std::map<std::string, PResource> __resources;
    
    PResource LocateResource(const char* resource)
    {
    	typedef std::map<std::string, PResource> resource_cache;
    	resource_cache::const_iterator it = __resources.find(resource);
    
    	PResource res = NULL;
    	if(it == __resources.end()) __resources.insert( std::make_pair(resource, res = ProtonEngine::CResourcesPaths::GetInstance().LocateNewResource(resource) ) );
    	else res = it->second;
    
    	return safe_addref(res);
    }
    In questo caso, la variabile "__resources" è nello scopo globale. Ho provato a mettere nello scopo globale anche la precedente map, ma non ha funzionato, ridandomi lo stesso errore.
    Questo che posto mo, funziona, non mi da alcun problema, ed praticamente la stessa cosa... il tipo "PResource" è un puntatore, proprio come nella precedente... Bho

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Devi aver combinato qualcosa prima. Io ho provato in tutti i modi, ma non riesco a replicare l'errore.
    Che prototipo ha GetID()?
    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.

  5. #5
    codice:
    struct IUIWidget
    {
    const char* GetID() const;
    };
    provo a riscrivere da capo, e vedo che succede, limitando al minimo gli #include

  6. #6
    Alleluja! ci sono riuscito!
    Ho riscritto la classe daccapo e mo compila che è una meraviglia!
    Sembra che a visual studio non piacciano i typedef all'interno delle dichiarazioni di classe, infatti facevo
    codice:
    typedef std::map<std::string, IUIWidget*> Widgets;
    Togliendolo ho risolto... grazie mille per il supporto

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.