Frage

Ich versuche das implementieren Kopier- und Swap-Idiom für meine Klasse, weil ich implementieren muss operator=, und da es Referenzmitglieder hat und Referenzen nur einmal zugewiesen werden können, dachte ich, dass die oben erwähnte Idiom eine gültige Problemumgehung sei.

Aber jetzt bekomme ich einen Build -Fehler:

>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>          ]

Es zeigt mich hier:

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

Dies ist die Swap -Funktion aus der Idiom, und m_Variables ist in der Tat ein Hinweis auf eine abstrakte Klasse. Ist es unmöglich, diese Art von Referenzen auszutauschen? Wenn es dafür eine Boost -Lösung gibt, sagen Sie es mir bitte, da ich kürzlich angefangen habe, sie zu verwenden.

War es hilfreich?

Lösung

Referenzen können nicht mehr ausgetauscht werden, als sie neu zugewiesen werden können. swap Versucht, die erwähnten Objekte auszutauschen (indem sie sie über ein temporäres Objekt zuweisen, falls der Standard std::swap wird genutzt). Da sie sich auf eine abstrakte Basisklasse beziehen, schlägt dies fehl, da der Temporary nicht erstellt werden kann.

Wenn Sie eine neu zugewiesene Referenz wünschen, verwenden Sie stattdessen einen Zeiger.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top