2017-09-21 4 views
-3

Ich versuche, eine gleichzeitige Datenstruktur zu implementieren, wie unten.Warum kann ich nicht auf das nächste Feld in dieser Struktur zugreifen?

struct Node;            
struct NodeList; 

struct NodeAtomic{ 
    struct Node* next; 
}; 

struct NodeListAtomic{ 
    struct NodeList* next; 
}; 

struct Node{ 
    atomic<struct NodeAtomic> ptr; 
}; 

struct NodeList 
{ 
    struct Node listhead; 
    atomic<struct NodeListAtomic> ptr; 
}; 

ich den Zugriff auf die Variable des Objekts wie folgt aus:

struct Node *temp; 
temp->listhead.ptr.next.load(); 

Aber ich erhalte den folgenden Fehler:

error: ‘struct std::atomic<NodeAtomic>’ has no member named ‘next’ 

Kann jemand bitte zeigen, wo dies falsch ist?

Antwort

0

Ich glaube, Sie haben versehentlich die Reihenfolge der .load() und next Felder vertauscht. Sie haben

temp->listhead.ptr.next.load(); 

statt

temp->listhead.ptr.load()->next; 

Dies sagt „Last, atomar, der Zeiger ptr genannt, und auf seiner nächsten Feld aussehen“, während das, was Sie vorher sagt hatte „Blick auf die next Feld das Atom Objekts ptr, dann ruft die Funktion load an diesem Zeiger

Unabhängig benannt., wenn der Typ der tempNode ist, dann ist ‚es isn t ein listhead Bereich zu sprechen. Meinst du für temp ein NodeList zu sein?

Schließlich, da dies C++ - Code ist, müssen Sie nicht alle Namen Ihrer Strukturtypen mit struct voranstellen, wenn Sie sie verwenden. Sie können zum Beispiel umschreiben

struct NodeList 
{ 
    struct Node listhead; 
    atomic<struct NodeListAtomic> ptr; 
}; 

als

struct NodeList 
{ 
    Node listhead; 
    atomic<NodeListAtomic> ptr; 
}; 
+0

Ich sehe! Das war sehr dumm von mir! Ich habe es einfach nicht bemerkt. Vielen Dank für Ihre Zeit. –

0

Verwenden Sie Ihre NodeList Struktur anstelle Ihrer Node Struktur.

+0

Das ein Problem ist, aber ich denke, es gibt andere auch hier sind. – templatetypedef

Verwandte Themen