2013-01-11 10 views
5

Próbuję utworzyć wersję QT mojego przyjaciela, którą zbudował na systemach Windows i Linux. Oboje używamy g ++. Używam gcc 4.2.1. Niestety nie wiem, jakiej wersji używał, kiedy zbudował aplikację (było to całkiem dawno temu).Niepoprawny błąd szablonu szablonu ("x" nie jest typem)

Czy ktoś może rzucić nieco światła na dlaczego ja dostaję błąd:

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

podczas kompilacji następujący kod:

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; 
    } 
    } 
... 

Dzięki.

EDYCJA: Przepraszam, jeśli nie było jasne, która linia była numerem 24. Jest to oznaczone komentarzem "Linia obraźliwa" w wyciągu Node.h.

+1

Czy możesz nam wskazać, który wiersz we fragmencie kodu ma linię 24? –

+7

Czy umieściłeś plik nagłówka 'Vector' w pliku nagłówkowym' Node'? I dlaczego warto używać własnej klasy wektorowej, gdy zarówno Qt, jak i standardowa biblioteka mają dobre klasy pracujące? –

+4

Czy gcc 4.2.1 jest najnowszym kompilatorem, jaki masz? Może jeśli przejdziesz do najnowszej wersji clang, zadziała lub uzyskasz lepsze komunikaty o błędach. – bames53

Odpowiedz

3

Niestety uważam, że standard rzeczywiście mówi, że ten kod jest źle sformułowany, patrz core issue 325. Gramatyka C++ mówi, że przecinek na liście argumentów dla domyślnego argumentu jest analizowany jako rozpoczynający następny argument funkcji, więc problem jest w bicie kodu = Vector<T, dimensions>(), więc dimensions jest traktowany jako początek nowego parametru funkcji, a nie jako część szablonu-id.

GCC 4.4.0 został zmieniony prawie pięć lat temu (patrz Bug 57), aby zaakceptować kod, czy masz dobry powód, aby używać tak starej wersji?

Jeśli nie można uaktualnić, można obejść ten problem dodając typedef do węzła:

typedef Vector<T, dimensions> VectorType; 

Następnie używając że:

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

Technicznie tylko domyślnym argumentem musi użyć typedef, ale użyłbym go do deklaracji parametrów i domyślnego argumentu. Właściwie prawie zawsze deklaruję typedef dla dowolnego typu kontenera używanego przez moje klasy, a następnie używam tego typedef w klasie. To jest często krótszy i oznacza, że ​​jeśli zmienisz pojemnik, często trzeba tylko zaktualizować typedef, a nie każde jego użycie.

+0

Świetne wyjaśnienie, dzięki. Używam wersji MacPorts 2.7, a problem został rozwiązany. Używałem 4.2.1, ponieważ jest to dołączone do Xcode. Doszedłem do wniosku, że wszystko, co przyszło z Xcode, będzie najbardziej stabilne dla rozwoju OS X. –

+1

Nie, to, co jest dostarczane z Xcode, to ostatnia wersja licencjonowana jako GPLv2. Firma Apple nie będzie wysyłała nowszej wersji z powodów związanych z licencją, a nie z przyczyn technicznych lub ze względu na stabilność. –

Powiązane problemy