Abbiamo riscontrato un problema nel porting del nostro codice alla versione meno recente 2010 di VC++.Crea puntatore al membro per il tipo di valore della mappa in vc2010
I problemi è causato dalla realizzazione di mappa in VC che si traduce in un derivato a base conversione di un pointer-to-member
in un non-type-argument
venga richiesto:
#include <map>
#include <algorithm>
template <typename MapValueType, int MapValueType::*var>
bool f (MapValueType const & v);
int main()
{
typedef std :: map<int, int> MapType;
MapType m;
std :: find_if (m.begin()
, m.end()
, f<MapType::value_type, & MapType::value_type::second>);
}
Il seguente messaggio viene generato:
La conversione standard da puntatore a membro di base a puntatore-membro di derivato non viene applicata per gli argomenti modello file.cc (x): errore C2973: 'f': argomento modello non valido 'int std :: _ Pair_base < _Ty1, _Ty2> :: * '
Così sembra che l'attuazione di value_type
nel std::map
ha la coppia in una classe base.
Qualche idea su come risolvere questo e mantenere il pointer-to-member
come non-type-argument
?
La nostra unica opzione è modificare la struttura in modo che f
sia un con un membro pointer-to-member
?
forse una domanda stupida, ma perché è necessario passare quel puntatore al membro? –
che cosa è con gli spazi che circondano '' 'e altri token lessicali? – TemplateRex
sì, giusto per chiarire la domanda precedente, perché più semplice 'template bool f (MapItemType const & v);' non funziona per te? –