Domanda

Sono porting su un codice basato su modelli da Windows e sto colpendo alcune differenze compilatore su iPhone 3.2 SDK.

Codice originale all'interno funzione di membro di un modello di classe è:

return BinarySearch<uint32, CSimpleKey<T> >(key);

dove BinarySearch è un metodo ereditato da un altro modello.

Questo produce il seguente errore:

csimplekeytable.h:131: error: no matching function for call to 'BinarySearch(NEngine::uint32&)'

Il compilatore di Visual Studio sembra camminare su per la multa gerarchia di modello, ma gcc mi ha bisogno di qualificare completamente dove la funzione viene da (Ho verificato questo fissando gli stessi problemi con le variabili di membro template in questo modo).

Quindi io adesso ho bisogno di cambiare questo in:

return CSimpleTable<CSimpleKey<T> >::BinarySearch<uint32, CSimpleKey<T> >(key);

che ora produce il seguente errore:

csimplekeytable.h:132: error: expected primary-expression before ',' token
csimplekeytable.h:132: error: expected primary-expression before '>' token

Dopo qualche graffio testa, credo che quello che sta succedendo qui è che si sta cercando di risolvere il '<' prima di BinarySearch come 'minore di' operatore per qualche ragione.

Quindi due domande:    - Sono sulla strada giusta con la mia interpretazione dell'errore?    - Come posso risolvere il problema

?

-D

È stato utile?

Soluzione

Se CSimpleTable è la classe base, è necessario qualificare la chiamata con quel nome classe di base o in alternativa con this. Ma dal momento che entrambe queste dipendono dai parametri di modello, il compilatore non può occhiata ciò che il nome significa BinarySearch. Potrebbe essere una costante intera statico, che si confronta contro qualcos'altro, o potrebbe essere un modello che si mette gli argomenti racchiusi tra <...> per. È necessario dire al compilatore A proposito di quest'ultimo

/* the "::template" means: 'the name that follows is a template' */
return CSimpleTable<CSimpleKey<T> >::template BinarySearch<uint32, CSimpleKey<T> >(key);

O con this

return this->template BinarySearch<uint32, CSimpleKey<T> >(key);

La ragione per la qualificazione è che il compilatore non cerca nomi non qualificati in classi di base che dipendono da parametri di modello (nel tuo caso il parametro è T), dal momento che il legame del nome dipenderebbe dal fatto che la classe di base ha tale nome una o no, che è considerato un peccato. Per un nome pianura come BinarySearch, v'è inoltre alcuna indicazione che questo nome dipende da un parametro di template, quindi il Principio richiede che i compilatori non ritardare ricerca del nome fino esemplificazione. Così il nome, anche se la ricerca in basi dipendenti sarebbe stato permesso in istanziazione (che non è), non poteva essere trovata in ogni caso.

Devi dire esplicitamente al compilatore di guardare nella classe racchiude qualificandosi essa, nel qual caso il compilatore prevede classi di base che dipendono durante la ricerca quando si crea un'istanza. Anteponendo this o il nome della classe farà anche il nome di dipendenti , ritardando così ricerca di esso fino esemplificazione. Questi due fatti sono necessari per farlo funzionare.

Altri suggerimenti

Forse è solo un problema con il typedef uint32. Potrebbe essere che non è disponibile nel nuovo ambiente. Nel primo caso le scelte risoluzione namespace fino NEngine :: Uint32, nel secondo caso non prendere nulla (da qui l'errore di analisi).

Suggerisco alla ricerca di come Uint32 è definito su Windows, e provare a copiare tale definizione sopra.

Forse è perché hai fatto i tuoi spaziature incoerente. Hai fatto CSimpleTable<CSimpleKey<T> >, piuttosto che CSimpleTable<CSimpleKey<T>>. Credo che dovrebbero essere entrambi validi, ma forse c'è un bug parser coinvolti.

Modifica:. Si potrebbe anche provare di scendere il tipo di argomento via automatica detrazione, e tagliare la specializzazione esplicita

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top