0
votes

Boost Serrure Free File d'attente d'une mission triviale et de destructeur

Lorsque vous essayez d'insérer un "événement" dans la file d'attente gratuite de Boost Lock, je reçois: Erreur: Échec de l'affirmation statique: (boost :: has_trivial_destractor :: valeur) et assertion statique échoué: (boost :: has_trivial_assign :: valeur). Je sais que l'exigence du conteneur est la suivante: T doit avoir un constructeur de copie T doit avoir un opérateur d'affectation triviale T doit avoir un destructeur trivial Je ne sais pas pourquoi ma classe d'événements ne répond pas à ces exigences.

J'ai lu cette question / réponse: / boost / lockfree / file d'attente.hpp: Erreur: l'affirmation statique a échoué: (boost :: has_trivial_destractor :: valeur) . Je ne vois pas pourquoi ma classe ne satisfera pas les exigences. xxx

/boost/1.57.0/inclu/boost/static_asserat.hpp:78:41: erreur : L'assertion statique a échoué: (Boost :: has_trivial_destructor :: valeur) # Définir BOOST_STICTIC_ASSERT (...) static_assert ( VA_ARGS , # va_args )

boost / 1.57.0 / Inclure / boost / static_asserat.hpp: 78:41: Erreur: L'assertion statique a échoué: (Boost :: has_trivial_assign :: valeur) # Définir BOOST_STICTIC_ASSERT (...) static_assert ( VA_ARGS , # va_args )


3 Réponses :


3
votes

Votre Classe est membre de type std :: string , qui a un opérateur d'affectation non trivial et un destructeur non trivial. Ceux qui arrêtent l'opérateur d'affectation généré automatiquement et destructeurs de événement d'être trivial. (Rappelez-vous que "trivial" ne signifie pas seulement "défaut". Cela signifie également que le comportement par défaut n'a rien à faire intéressant. Une mission triviale ne fait que copier des bits; un destructeur trivial est un non-op.) < / p>


0 commentaires

1
votes

std :: string n'a pas d'opérateur d'affectation de copie triviale ni d'un destructeur trivial. Parce que ce n'est pas le cas, et c'est un membre de votre classe, cela signifie que votre classe ne le fait pas aussi. Vous devez supprimer l'élément de chaîne si vous voulez qu'il soit trivial.


0 commentaires

2
votes

En plus des deux autres réponses notant que le membre std :: string L'élément de données empêche le constructeur d'être trivial, l'événement () constructeur doit être trivial. Cela signifie qu'il doit être généré par le compilateur et non implémenté par l'utilisateur. Il peut être réalisé soit en supprimant complètement le constructeur, soit en le marquant comme explicitement par défaut ( événement () = par défaut; ). Il en va de même pour le constructeur de copie et l'opérateur d'affectation.

En général, les exigences relatives à un constructeur par défaut trivial sont répertoriées ici .


0 commentaires