<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[[gelöst] pair oder Operator]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich schreibe gerade eine Midi-Klasse und diese soll per Operator ein NoteOn senden.</p>
<p>Folgendes:</p>
<pre><code class="language-cpp">// MidiDefines.h
#include &lt;utility&gt;

typedef unsigned char MidiValue; // Wert eines Midi-Befehls
typedef std::pair&lt;MidiValue, MidiValue&gt; MidiNote; // Eine Note mit Position und Lautstärke

enum MidiBefehle {
  MidiBefehlNoteOn = 144
};

// MidiOutputChannel.h
class MidiOutputChannel
{
public:
  /* Noten */
  // Note an
  bool NoteOn(const MidiValue&amp; Note, MidiValue Velocity = MidiVelocityNorm);
  /* Operatoren */
  // Note an | alias NoteOn();
  MidiOutputChannel&amp; operator+=(MidiNote&amp; Note);
  MidiOutputChannel&amp; operator+=(MidiValue&amp; Note);
};

// MidiOutputChannel_win.cpp
/* Noten */
// Note an
bool MidiOutputChannel::NoteOn(const MidiValue&amp; Note, MidiValue Velocity)
{
  bool toret = MessageSendNote(MidiBefehlNoteOn, Note, Velocity);
  if (toret)
  {
  // ...
  }
  return toret;
}

/* Operatoren */
// Note an | alias NoteOn();
MidiOutputChannel&amp; MidiOutputChannel::operator+=(MidiNote&amp; Note)
{
  NoteOn(Note.first,Note.second);
  return *this;
}

MidiOutputChannel&amp; MidiOutputChannel::operator+=(MidiValue&amp; Note)
{
  NoteOn(Note);
  return *this;
}

// Sample
Sample::SampleMidi()
{
  ChanSound = MyPort-&gt;ChannelGet(1); // Gibt MidiOutputChannel* zurück
  ChanSound-&gt;VolumeSet(120);
  ChanSound-&gt;ProgrammSet(gmProgAcousticGrandPiano); // gmProgAcousticGrandPiano = 0
  MidiValue Grundton = 36; // Tiefes C
  ChanSound += MidiNote(Grundton,127); // Eins
  ChanSound += Grundton; // Zwei
  ChanSound-&gt;NoteOffAll();
}
</code></pre>
<p>Siehe Sample:<br />
-&gt; Zwei geht problemlos.<br />
-&gt; Eins gibt folgenden Fehler aus:</p>
<pre><code>error C2677: Binärer Operator '+=': Es konnte kein globaler Operator gefunden werden, der den Typ 'std::pair&lt;_Ty1,_Ty2&gt;' akzeptiert (oder keine geeignete Konvertierung möglich)
</code></pre>
<p>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?</p>
<p>Kurz die Aufgabe:<br />
Ich möchte ein pair&lt;unsigned char, unsigned char&gt; in einen Operator += übergeben.<br />
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.</p>
<p>Ich kann irgendwie das Problem nicht richtig zuordnen, da ich ja im Header einen operator+=(MidiNote&amp; Note) definiert habe. Der wird aber irgendwie vom Sample aus nicht gefunden (Header included).</p>
<p>Bitte um Hilfe.<br />
Danke,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/276006/gelöst-pair-oder-operator</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 14:36:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/276006.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 25 Oct 2010 10:09:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] pair oder Operator on Mon, 25 Oct 2010 11:15:16 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich schreibe gerade eine Midi-Klasse und diese soll per Operator ein NoteOn senden.</p>
<p>Folgendes:</p>
<pre><code class="language-cpp">// MidiDefines.h
#include &lt;utility&gt;

typedef unsigned char MidiValue; // Wert eines Midi-Befehls
typedef std::pair&lt;MidiValue, MidiValue&gt; MidiNote; // Eine Note mit Position und Lautstärke

enum MidiBefehle {
  MidiBefehlNoteOn = 144
};

// MidiOutputChannel.h
class MidiOutputChannel
{
public:
  /* Noten */
  // Note an
  bool NoteOn(const MidiValue&amp; Note, MidiValue Velocity = MidiVelocityNorm);
  /* Operatoren */
  // Note an | alias NoteOn();
  MidiOutputChannel&amp; operator+=(MidiNote&amp; Note);
  MidiOutputChannel&amp; operator+=(MidiValue&amp; Note);
};

// MidiOutputChannel_win.cpp
/* Noten */
// Note an
bool MidiOutputChannel::NoteOn(const MidiValue&amp; Note, MidiValue Velocity)
{
  bool toret = MessageSendNote(MidiBefehlNoteOn, Note, Velocity);
  if (toret)
  {
  // ...
  }
  return toret;
}

/* Operatoren */
// Note an | alias NoteOn();
MidiOutputChannel&amp; MidiOutputChannel::operator+=(MidiNote&amp; Note)
{
  NoteOn(Note.first,Note.second);
  return *this;
}

MidiOutputChannel&amp; MidiOutputChannel::operator+=(MidiValue&amp; Note)
{
  NoteOn(Note);
  return *this;
}

// Sample
Sample::SampleMidi()
{
  ChanSound = MyPort-&gt;ChannelGet(1); // Gibt MidiOutputChannel* zurück
  ChanSound-&gt;VolumeSet(120);
  ChanSound-&gt;ProgrammSet(gmProgAcousticGrandPiano); // gmProgAcousticGrandPiano = 0
  MidiValue Grundton = 36; // Tiefes C
  ChanSound += MidiNote(Grundton,127); // Eins
  ChanSound += Grundton; // Zwei
  ChanSound-&gt;NoteOffAll();
}
</code></pre>
<p>Siehe Sample:<br />
-&gt; Zwei geht problemlos.<br />
-&gt; Eins gibt folgenden Fehler aus:</p>
<pre><code>error C2677: Binärer Operator '+=': Es konnte kein globaler Operator gefunden werden, der den Typ 'std::pair&lt;_Ty1,_Ty2&gt;' akzeptiert (oder keine geeignete Konvertierung möglich)
</code></pre>
<p>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?</p>
<p>Kurz die Aufgabe:<br />
Ich möchte ein pair&lt;unsigned char, unsigned char&gt; in einen Operator += übergeben.<br />
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.</p>
<p>Ich kann irgendwie das Problem nicht richtig zuordnen, da ich ja im Header einen operator+=(MidiNote&amp; Note) definiert habe. Der wird aber irgendwie vom Sample aus nicht gefunden (Header included).</p>
<p>Bitte um Hilfe.<br />
Danke,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1970274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1970274</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Mon, 25 Oct 2010 11:15:16 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] pair oder Operator on Mon, 25 Oct 2010 10:32:16 GMT]]></title><description><![CDATA[<p>Wenn ChanSound ein MidiOutputChannel* ist, dann passt dein Additionsoperator (Member von MidiOutputChannel) nicht dazu. Du musst ChanSound also erst dereferenzieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1970283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1970283</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 25 Oct 2010 10:32:16 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] pair oder Operator on Mon, 25 Oct 2010 10:36:10 GMT]]></title><description><![CDATA[<p>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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1970284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1970284</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Mon, 25 Oct 2010 10:36:10 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] pair oder Operator on Mon, 25 Oct 2010 11:14:39 GMT]]></title><description><![CDATA[<p>Danke für euere Hinweise. Habt mir sehr geholfen.</p>
<p>Lösung:</p>
<pre><code class="language-cpp">/* Operatoren */
  // Note an | alias NoteOn();
  MidiOutputChannel&amp; operator+=(const MidiNote&amp; Note);
  MidiOutputChannel&amp; operator+=(const MidiValue&amp; Note);
</code></pre>
<p>.</p>
<pre><code class="language-cpp">*ChanSound += MidiNote(Grundton,127); // Eins
  *ChanSound += Grundton; // Zwei
</code></pre>
<p>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).</p>
<p>Mein <em>ChanSound += Grundton;</em> 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.</p>
<p>Danke,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1970298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1970298</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Mon, 25 Oct 2010 11:14:39 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] pair oder Operator on Mon, 25 Oct 2010 11:36:08 GMT]]></title><description><![CDATA[<p>stefanjann schrieb:</p>
<blockquote>
<p>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).</p>
</blockquote>
<p>Korrekt.</p>
<blockquote>
<p>Mein <em>ChanSound += Grundton;</em> 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.</p>
</blockquote>
<p>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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1970313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1970313</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 25 Oct 2010 11:36:08 GMT</pubDate></item></channel></rss>