Question

Je suis en train de mettre en œuvre le Copier-Swap Idiom pour ma classe, parce que je dois mettre en œuvre operator=, et comme il a des membres de référence, et les références ne peut être attribué qu'une seule fois, je pensais que l'idiome mentionné ci-dessus était une solution valable.

Mais maintenant, je reçois une erreur de construction:

>c:\Program Files\Microsoft Visual Studio 10.0\VC\include\utility(102): error C2259: 'IVariables' : cannot instantiate abstract class
1>          due to following members:
1>          'IVariables::~IVariables(void)' : is abstract
1>          d:\svn.dra.workingcopy\serialport\IVariables.h(6) : see declaration of 'IVariables::~IVariables'
1>          'std::string &IVariables::operator [](const std::string &)' : is abstract
1>          d:\svn.dra.workingcopy\serialport\IVariables.h(7) : see declaration of 'IVariables::operator []'
1>          'unsigned int IVariables::getVariableLength(const std::string &) const' : is abstract
1>          d:\svn.dra.workingcopy\serialport\IVariables.h(8) : see declaration of 'IVariables::getVariableLength'
1>          Message.cpp(32) : see reference to function template instantiation 'void std::swap<IVariables>(_Ty &,_Ty &)' being compiled
1>          with
1>          [
1>              _Ty=IVariables
1>          ]

Il me signale ici:

void Swap( CMessage& a, CMessage& b ){
    using std::swap;
    swap( a.m_bIgnoreIncoming, b.m_bIgnoreIncoming );
    swap( a.m_Variables, b.m_Variables );
}

Ceci est la fonction de swap de l'idiome, et m_Variables est en effet une référence à une classe abstraite. Est-il impossible de remplacer à ce genre de références? S'il y a une solution Boost pour cela, s'il vous plaît me dire depuis que je récemment commencé à l'utiliser.

Était-ce utile?

La solution

Références ne peut être échangé plus qu'elles ne peuvent être réaffectés. swap tentera d'échanger les objets étant appelés (en leur attribuant au moyen d'un objet temporaire, si l'on utilise le std::swap par défaut). Comme ils se réfèrent à une classe de base abstraite, cela ne peut depuis le temporaire ne sera pas créé.

Si vous voulez une référence réaffectable, puis utiliser un pointeur à la place.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top