[gelöst] pair oder Operator



  • Hallo,

    ich schreibe gerade eine Midi-Klasse und diese soll per Operator ein NoteOn senden.

    Folgendes:

    // MidiDefines.h
    #include <utility>
    
    typedef unsigned char MidiValue; // Wert eines Midi-Befehls
    typedef std::pair<MidiValue, MidiValue> MidiNote; // Eine Note mit Position und Lautstärke
    
    enum MidiBefehle {
      MidiBefehlNoteOn = 144
    };
    
    // MidiOutputChannel.h
    class MidiOutputChannel
    {
    public:
      /* Noten */
      // Note an
      bool NoteOn(const MidiValue& Note, MidiValue Velocity = MidiVelocityNorm);
      /* Operatoren */
      // Note an | alias NoteOn();
      MidiOutputChannel& operator+=(MidiNote& Note);
      MidiOutputChannel& operator+=(MidiValue& Note);
    };
    
    // MidiOutputChannel_win.cpp
    /* Noten */
    // Note an
    bool MidiOutputChannel::NoteOn(const MidiValue& Note, MidiValue Velocity)
    {
      bool toret = MessageSendNote(MidiBefehlNoteOn, Note, Velocity);
      if (toret)
      {
      // ...
      }
      return toret;
    }
    
    /* Operatoren */
    // Note an | alias NoteOn();
    MidiOutputChannel& MidiOutputChannel::operator+=(MidiNote& Note)
    {
      NoteOn(Note.first,Note.second);
      return *this;
    }
    
    MidiOutputChannel& MidiOutputChannel::operator+=(MidiValue& Note)
    {
      NoteOn(Note);
      return *this;
    }
    
    // Sample
    Sample::SampleMidi()
    {
      ChanSound = MyPort->ChannelGet(1); // Gibt MidiOutputChannel* zurück
      ChanSound->VolumeSet(120);
      ChanSound->ProgrammSet(gmProgAcousticGrandPiano); // gmProgAcousticGrandPiano = 0
      MidiValue Grundton = 36; // Tiefes C
      ChanSound += MidiNote(Grundton,127); // Eins
      ChanSound += Grundton; // Zwei
      ChanSound->NoteOffAll();
    }
    

    Siehe Sample:
    -> Zwei geht problemlos.
    -> Eins gibt folgenden Fehler aus:

    error C2677: Binärer Operator '+=': Es konnte kein globaler Operator gefunden werden, der den Typ 'std::pair<_Ty1,_Ty2>' akzeptiert (oder keine geeignete Konvertierung möglich)
    

    Ich galub ich hab jetzt schon alles probiert. Header sind alle drinnen. Visual Studio 2008 kennt auch mit Itelli-Sense die ganzen Typen. Was mache ich nun falsch?

    Kurz die Aufgabe:
    Ich möchte ein pair<unsigned char, unsigned char> in einen Operator += übergeben.
    Dabei möchte ich den pair über typedef definieren, damit ich später auch unter Linux und Mac schreiben kann, wo die Typen evtl anders aussehen müssen.

    Ich kann irgendwie das Problem nicht richtig zuordnen, da ich ja im Header einen operator+=(MidiNote& Note) definiert habe. Der wird aber irgendwie vom Sample aus nicht gefunden (Header included).

    Bitte um Hilfe.
    Danke,
    Stefan


  • Mod

    Wenn ChanSound ein MidiOutputChannel* ist, dann passt dein Additionsoperator (Member von MidiOutputChannel) nicht dazu. Du musst ChanSound also erst dereferenzieren.



  • Du versuchst einer Funktion, die eine nicht-konstante Referenz erwartet (operator+=) ein temporäres Objekt unterzuschieben. Mach ne const-Referenz draus, dann geht das. Oder über kein temporäres Objekt.



  • Danke für euere Hinweise. Habt mir sehr geholfen.

    Lösung:

    /* Operatoren */
      // Note an | alias NoteOn();
      MidiOutputChannel& operator+=(const MidiNote& Note);
      MidiOutputChannel& operator+=(const MidiValue& Note);
    

    .

    *ChanSound += MidiNote(Grundton,127); // Eins
      *ChanSound += Grundton; // Zwei
    

    Ich hab mir das mal durchgelesen mit Zeiger und Ohne. Wenn ich das richtig verstanden habe, dann würde ein ChanSound+= auf den Zeiger addieren (den Operator gibt es hier nicht) und ein *****ChanSound+= addiert auf das Objekt (den Operator hab ich definiert).

    Mein ChanSound += Grundton; ist zwar durch den Compiler gegangen, hätte aber den Zeiger verschoben (nicht den Operator aufgerufen, wie gewollt) und somit zu einer Speicherschutzverletzung geführt.

    Danke,
    Stefan


  • Mod

    stefanjann schrieb:

    Ich hab mir das mal durchgelesen mit Zeiger und Ohne. Wenn ich das richtig verstanden habe, dann würde ein ChanSound+= auf den Zeiger addieren (den Operator gibt es hier nicht) und ein *****ChanSound+= addiert auf das Objekt (den Operator hab ich definiert).

    Korrekt.

    Mein ChanSound += Grundton; ist zwar durch den Compiler gegangen, hätte aber den Zeiger verschoben (nicht den Operator aufgerufen, wie gewollt) und somit zu einer Speicherschutzverletzung geführt.

    Ebenfalls korrekt. MidiValue ist bei dir ein typedef für unsigned char. unsigned char ist ein integraler Typ und für Zeiger gibt es eine Standardaddition integraler Typen.


Anmelden zum Antworten