2017-09-21 6 views
-3

J'essaie de mettre en œuvre une structure de données concurrente, comme ci-dessous.Pourquoi ne puis-je pas accéder au champ suivant dans cette structure?

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

J'accède la variable de l'objet comme celui-ci:

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

Mais je reçois l'erreur suivante:

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

Quelqu'un peut-il s'il vous plaît indiquer où cela est faux?

Répondre

0

Je pense que vous avez accidentellement échangé l'ordre des champs .load() et next. Vous avez

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

au lieu de

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

Cela dit « charge, atomiquement, le pointeur nommé ptr, et regardez son champ suivant », alors que ce que vous aviez avant dit « regarder le champ next de l'objet atomique nommé ptr, puis appeler la fonction load sur ce pointeur.

Indépendamment, si le type de temp est Node, alors il n » est pas t un champ listhead à proprement parler. Voulez-vous dire par temp être NodeList?

Enfin, puisqu'il s'agit d'un code C++, vous n'avez pas besoin de préfixer tous les noms de vos types de structure avec struct lorsque vous les utilisez. Vous pouvez, par exemple, réécrire

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

comme

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

Je vois! C'était très stupide de ma part! Je n'ai juste pas remarqué ça. Merci pour votre temps. –

0

Utilisez votre struct NodeList à la place de votre structure Node.

+0

C'est une question, mais je pense qu'il ya d'autres ici. – templatetypedef