2013-01-11 15 views
5

Sto tentando di creare una versione OS X dell'applicazione QT del mio amico, che ha creato su Windows e Linux. Entrambi usiamo g ++. Sto usando gcc 4.2.1. Sfortunatamente non so quale versione abbia usato quando ha compilato l'applicazione (è passato parecchio tempo).Errore parametro modello non di tipo ('x' non è un tipo)

Qualcuno potrebbe far luce sul perché sto ottenendo l'errore:

../../../src/dbapi/dbcore/node.h:24: error: 'dimensions' is not a type 

quando si compila il seguente codice:

Node.h:

template<class T,const unsigned int dimensions> 
class EXPORT_DBCORE Node : public Transform<T,dimensions> 
{ 
public: 
    Node(Id id, 
     QString& name, 
     QString& text = "", 
     // ************** Offending line: *************** 
     Vector<T,dimensions> position = Vector<T,dimensions>(), 
     Quaternion<T> rotation = Quaternion<T>()) 
    : Transform<T,dimensions>(position, rotation) 
    , mId(id) 
    , mName(name) 
    , mText(text) 
    { 
    } 

private: 
    ... 
}; 

Vector.h:

template<class T,const unsigned int dimensions> 
class EXPORT_DBCORE Vector 
{ 
public: 
    //! Default Constructor 
    Vector() 
    { 
    mpArray = new T[dimensions]; 
    for(int i = 0; i < dimensions; i++) 
    { 
     mpArray[i] = 0; 
    } 
    } 
... 

Grazie.

MODIFICA: Scusa se non era chiaro quale riga fosse il numero 24. Viene indicato dal commento "Riga non valida" nell'estratto Node.h.

+1

Puoi darci un suggerimento su quale riga nello snippet di codice è la linea 24? –

+7

Hai incluso il file di intestazione 'Vector' nel file di intestazione' Node'? E perché usare la propria classe vettoriale, quando sia Qt che la libreria standard hanno buone classi lavorative? –

+4

È gcc 4.2.1 il compilatore più recente che hai? Forse se passi a una versione recente di clang funzionerà o riceverai messaggi di errore migliori. – bames53

risposta

3

Purtroppo penso che lo standard in realtà dice che questo codice è mal formato, vedere core issue 325. La grammatica C++ dice che una virgola nella lista degli argomenti del template per un argomento predefinito viene analizzata come avvio dell'argomento della funzione successiva, quindi il problema è nel bit = Vector<T, dimensions>() del codice, quindi dimensions viene preso come avvio di un nuovo parametro di funzione, non come parte dell'id del modello.

GCC 4.4.0 è stato modificato quasi cinque anni fa (vedere Bug 57) per accettare il codice, hai una buona ragione per utilizzare una versione così vecchia?

Se non è possibile eseguire l'aggiornamento, è possibile aggirare il bug con l'aggiunta di un typedef al Nodo:

typedef Vector<T, dimensions> VectorType; 

Poi utilizzando tale:

Node(Id id, 
     QString& name, 
     QString& text = "", 
     VectorType position = VectorType(), 
     Quaternion<T> rotation = Quaternion<T>()) 

Tecnicamente solo l'argomento di default ha la necessità di utilizzare il typedef, ma lo userei per la dichiarazione dei parametri e l'argomento predefinito. In effetti, quasi sempre dichiaro un typedef per ogni tipo di contenitore utilizzato dalle mie classi e quindi uso quel typedef nella classe. Questo è spesso più breve e significa che se si cambia contenitore, spesso è sufficiente aggiornare il typedef, non tutti gli usi.

+0

Ottima spiegazione, grazie. Sto usando la build MacPorts 2.7 e il problema è stato risolto. Stavo usando 4.2.1 perché è quello che viene fornito con Xcode. Ho capito che tutto ciò che è venuto con Xcode sarebbe stato il più stabile per lo sviluppo di OS X. –

+1

No, ciò che viene fornito con Xcode è l'ultima versione con licenza GPLv2. Apple non invierà una versione più recente per motivi di licenza, non per ragioni tecniche o ragioni di stabilità. –

Problemi correlati