<?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[Verwendung template klasse als attribut]]></title><description><![CDATA[<p>Guten Morgen!!</p>
<p>Ich verzweifel gerade an der Verwendung eines templates. Ich habe eine ringbuffer class mit folgender definition</p>
<pre><code>template &lt;typename kind, int RING_BUFFER_SIZE&gt; class ringbuffer{...}
</code></pre>
<p>allerdings schaffe ich es nicht, in einer anderen klasse als attribut zu deklarieren...</p>
<pre><code>rinbuffer&lt;char, 5&gt; myBuffer
</code></pre>
<p>sagt immer:</p>
<pre><code>Fehler: expexted &gt;&gt;:&lt;&lt; before &gt;&gt;&lt;&gt; token
Fehler: ISO-C++ verbietet Deklaration von &gt;&gt;ringbuffer&lt;&lt; ohne Typ
</code></pre>
<p>Ich verwende Linux und den GCC... hat irgend jemand eine Idee?</p>
<p>vielen Dank im voraus!<br />
Peter</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/224210/verwendung-template-klasse-als-attribut</link><generator>RSS for Node</generator><lastBuildDate>Fri, 02 Oct 2026 18:26:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/224210.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 07 Oct 2008 06:14:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verwendung template klasse als attribut on Tue, 07 Oct 2008 06:14:43 GMT]]></title><description><![CDATA[<p>Guten Morgen!!</p>
<p>Ich verzweifel gerade an der Verwendung eines templates. Ich habe eine ringbuffer class mit folgender definition</p>
<pre><code>template &lt;typename kind, int RING_BUFFER_SIZE&gt; class ringbuffer{...}
</code></pre>
<p>allerdings schaffe ich es nicht, in einer anderen klasse als attribut zu deklarieren...</p>
<pre><code>rinbuffer&lt;char, 5&gt; myBuffer
</code></pre>
<p>sagt immer:</p>
<pre><code>Fehler: expexted &gt;&gt;:&lt;&lt; before &gt;&gt;&lt;&gt; token
Fehler: ISO-C++ verbietet Deklaration von &gt;&gt;ringbuffer&lt;&lt; ohne Typ
</code></pre>
<p>Ich verwende Linux und den GCC... hat irgend jemand eine Idee?</p>
<p>vielen Dank im voraus!<br />
Peter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1594571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1594571</guid><dc:creator><![CDATA[escapete]]></dc:creator><pubDate>Tue, 07 Oct 2008 06:14:43 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung template klasse als attribut on Tue, 07 Oct 2008 06:25:07 GMT]]></title><description><![CDATA[<p>Ich denke mal, dass du rinbuffer falsch geschrieben hast, sollte das nicht eher ringbuffer heissen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1594576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1594576</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 07 Oct 2008 06:25:07 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung template klasse als attribut on Tue, 07 Oct 2008 06:37:06 GMT]]></title><description><![CDATA[<p>habs scho im sourcecode richtig geschrieben, allerdings hier im post falsch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1594585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1594585</guid><dc:creator><![CDATA[escapete]]></dc:creator><pubDate>Tue, 07 Oct 2008 06:37:06 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung template klasse als attribut on Tue, 07 Oct 2008 06:39:58 GMT]]></title><description><![CDATA[<p>OK.<br />
Dann zeig mal bitte, was du wirklich hast. ( Warum meiden hier alle copy-paste?!)<br />
Wie aktuell ist dein Compiler? - Manche ältere haben Probleme mit Templates..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1594586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1594586</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 07 Oct 2008 06:39:58 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung template klasse als attribut on Tue, 07 Oct 2008 06:47:39 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>( Warum meiden hier alle copy-paste?!)</p>
</blockquote>
<p>Wohl aus zwei Gründen:<br />
1. Wir könnten ihren Code klauen, der doch immer ach so gut ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
2. Gewisse sind so klug und wollen uns nicht mit all zu viel Code erschlagen. Das ist ja eigentlich eine gute Idee, aber viele kürzen am Ende dann doch zu viel weg.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12499">@escapete</a>,<br />
Ein gekürzter Header von <code>ringbuffer</code> und die Zeile oder auch ein paar mehr (oben und unten), von der Stelle wo der Fehler auftaucht.</p>
<p>Oder einen kurzen ähnlichen Code, wo der gleiche Fehler auftritt. Beim erstellen dieses kurzen Codes erkennt man den Fehler manchmal selbst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1594591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1594591</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 07 Oct 2008 06:47:39 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung template klasse als attribut on Tue, 07 Oct 2008 06:48:13 GMT]]></title><description><![CDATA[<p>Verwende den GCC in Version 4.2.3 (Thread-Modell: Posix)</p>
<p>hier meine ringbuffer class, die ich in einer anderen classe als attribut verwenden will...</p>
<pre><code class="language-cpp">template &lt;class kind, int RING_BUFFER_SIZE&gt;class ringbuffer {
private:
    kind buffer[RING_BUFFER_SIZE];
    int readPointer;
    int writePointer;
    int usedSpace;
    int availSpace;

public:
	ringbuffer(){
    	#ifdef DEBUG_RING_BUFFER
    		cout &lt;&lt; &quot;Template RingBuffer Constructor&quot; &lt;&lt; endl;
    	#endif 
    	readPointer = 0;
    	writePointer = 0;
    	availSpace = RING_BUFFER_SIZE;
    	usedSpace = 0;
    }
    ~ringbuffer(){
    	#ifdef DEBUG_RING_BUFFER
    		cout &lt;&lt; &quot;Template RingBuffer Destructor&quot; &lt;&lt; endl;
    	#endif    
    	delete []buffer;
    }

	ringbuffer(ringbuffer &amp; old_ring_buf) {
		#ifdef DEBUG_RING_BUFFER
			cout &lt;&lt; &quot;Template RingBuffer Constructor Overloaded&quot; &lt;&lt; endl;
		#endif
	        this-&gt;memcpy(this-&gt;buffer, old_ring_buf.buffer, RING_BUFFER_SIZE*sizeof(kind));
	        readPointer = old_ring_buf.readPointer;
	        writePointer = old_ring_buf.writePointer;
	        usedSpace =  old_ring_buf.usedSpace;
	        availSpace = old_ring_buf.availSpace;
	}

	int append(kind * data, int length){

		#ifdef DEBUG_RING_BUFFER
			cout &lt;&lt; &quot;Template RingBuffer Append-extended&quot; &lt;&lt; endl;
		#endif

		// enough space in buffer?
		if(length &lt;= availSpace ){
			if(writePointer &gt;= RING_BUFFER_SIZE) {
				writePointer = 0;
	    	}

			#ifdef DEBUG_RING_BUFFER
				cout &lt;&lt; &quot; Information - &quot;;
				cout &lt;&lt; &quot;readPtr: &quot;&lt;&lt; readPointer;
				cout &lt;&lt; &quot;, writePtr: &quot;&lt;&lt; writePointer;
				cout &lt;&lt; &quot;, used: &quot; &lt;&lt; usedSpace; 
				cout &lt;&lt; &quot;, available: &quot;&lt;&lt; availSpace;
				cout &lt;&lt; &quot;, length: &quot; &lt;&lt; length;
				cout &lt;&lt; &quot;, Offset: &quot; &lt;&lt;  (sizeof(kind)*writePointer) &lt;&lt; endl;
			#endif

			// proof if a wrap around is necessary
			if(length &lt;= RING_BUFFER_SIZE-writePointer){
				#ifdef DEBUG_RING_BUFFER
					cout &lt;&lt; &quot;NO WRAP AROUND&quot;&lt;&lt;endl;
				#endif
				// no wrap around - copy all data
				memcpy(buffer + (writePointer), data, sizeof(kind)*length);

				writePointer += length;
				usedSpace += length;
				availSpace -= length;

			}else{
				// wrap around
				int dumReadPointer = readPointer;
				#ifdef DEBUG_RING_BUFFER
					cout &lt;&lt; &quot;WRAP AROUND&quot;&lt;&lt;endl;
				#endif
				// Bug?! readPointer is set to 0 after memcpy - dont know why
				memcpy(buffer + (writePointer), data, sizeof(RING_BUFFER_SIZE-writePointer));
				memcpy(buffer, data + (RING_BUFFER_SIZE-writePointer), sizeof(kind)*(length-(RING_BUFFER_SIZE-writePointer)));

				availSpace -= length;
				usedSpace+= length;
				int dummy; 
				//dummy = length-sizeof(kind)*(RING_BUFFER_SIZE-writePointer);
				dummy = length-(RING_BUFFER_SIZE-writePointer);
				writePointer = length-(RING_BUFFER_SIZE-writePointer); //dummy;
				readPointer = dumReadPointer;
			}

			#ifdef DEBUG_RING_BUFFER
				cout &lt;&lt; &quot;_Information - &quot;;
				cout &lt;&lt; &quot;readPtr: &quot;&lt;&lt; readPointer;
				cout &lt;&lt; &quot;, writePtr: &quot;&lt;&lt; writePointer;
				cout &lt;&lt; &quot;, used: &quot; &lt;&lt; usedSpace; 
				cout &lt;&lt; &quot;, available: &quot;&lt;&lt; availSpace;
				cout &lt;&lt; &quot;, length: &quot; &lt;&lt; length;
				cout &lt;&lt; &quot;, Offset: &quot; &lt;&lt;  (sizeof(kind)*writePointer) &lt;&lt; endl;
			#endif
			return 0;	

		}
		else {
			#ifdef DEBUG_RING_BUFFER
				cout &lt;&lt; &quot;Not enough space in buffer to copy data&quot;&lt;&lt; endl;
			#endif
		}
		return -1;
	}

	int append(kind value) {
		#ifdef DEBUG_RING_BUFFER
			cout &lt;&lt; &quot;Template RingBuffer Append&quot; &lt;&lt; endl;
		#endif
		if(availSpace &lt;= 0 &amp;&amp; usedSpace &gt;= RING_BUFFER_SIZE){
			#ifdef DEBUG_RING_BUFFER
				cout &lt;&lt; &quot;Not enough space in buffer to copy value&quot;&lt;&lt; endl;
			#endif
			return -1;
		}

	    if(writePointer &gt;= RING_BUFFER_SIZE) {
	        writePointer = 0;
	    }

		#ifdef DEBUG_RING_BUFFER
			cout &lt;&lt; &quot;Information - &quot;;
			cout &lt;&lt; &quot;readPtr: &quot;&lt;&lt; readPointer;
			cout &lt;&lt; &quot;, writePtr: &quot;&lt;&lt; writePointer;
			cout &lt;&lt; &quot;, used: &quot; &lt;&lt; usedSpace; 
			cout &lt;&lt; &quot;, available: &quot;&lt;&lt; availSpace;
			cout &lt;&lt; &quot;, Offset: &quot; &lt;&lt;  (sizeof(kind)*writePointer) &lt;&lt; endl;
		#endif

	    *( buffer + writePointer  )= value;
		availSpace--;
		usedSpace++;
	    ++writePointer;

		#ifdef DEBUG_RING_BUFFER
			cout &lt;&lt; &quot;_Information - &quot;;
			cout &lt;&lt; &quot;readPtr: &quot;&lt;&lt; readPointer;
			cout &lt;&lt; &quot;, writePtr: &quot;&lt;&lt; writePointer;
			cout &lt;&lt; &quot;, used: &quot; &lt;&lt; usedSpace; 
			cout &lt;&lt; &quot;, available: &quot;&lt;&lt; availSpace;
			cout &lt;&lt; &quot;, Offset: &quot; &lt;&lt;  (sizeof(kind)*writePointer) &lt;&lt; endl;
		#endif
	    return 0;
	}

    kind get(){   
		#ifdef DEBUG_RING_BUFFER
			cout &lt;&lt; &quot;Template RingBuffer Get&quot; &lt;&lt; endl;
		#endif

    	if(usedSpace &lt;= 0 &amp;&amp; availSpace &gt;= RING_BUFFER_SIZE){
    		#ifdef DEBUG_RING_BUFFER
    			cout &lt;&lt; &quot;Buffer empty - Can't return any value&quot; &lt;&lt; endl;
    		#endif    		
    		return NULL;
    	}

    	if(readPointer &gt;= RING_BUFFER_SIZE) {
            readPointer = 0;
        }
		usedSpace--;
		availSpace++;

        ++readPointer;

	return(buffer[(readPointer-1)]);
    }

    kind get(kind * data, int length){
    	// it is not possible to require more data than available
		if(length &gt; usedSpace)
    		return NULL;

    	// proof, if the buffer is empty
    	if(usedSpace &lt;= 0 &amp;&amp; availSpace &gt;= RING_BUFFER_SIZE){
    		cout &lt;&lt; &quot;Buffer empty &quot; &lt;&lt; endl;
    		return NULL;
    	}
    	// t.b.d. not in the mood
    	// tbd

		if(readPointer &gt;= RING_BUFFER_SIZE) {
		        readPointer = 0;
        }

		usedSpace--;
		availSpace++;

	    ++readPointer;
        //return( buffer[(readPointer-1)] );
    }

    int readPos(){
        return (readPointer);
    }

    int writePos(){
        return (writePointer);
    }
    int available(){
        return (availSpace);
    }
    int used(){
        return (usedSpace);
    }

}; 

#endif /*RINGBUFFER_H_*/
</code></pre>
<p>hier die class, die den ringbuffer verwenden soll...</p>
<pre><code class="language-cpp">class test{

	private:

	    int fileDescriptor;
	    char portName[PORT_NAME_LENGTH];
    	    bool mIsOpen;

    	    ringbuffer&lt;char, 5&gt;p;
            // etc...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1594592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1594592</guid><dc:creator><![CDATA[escapete]]></dc:creator><pubDate>Tue, 07 Oct 2008 06:48:13 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung template klasse als attribut on Tue, 07 Oct 2008 06:50:11 GMT]]></title><description><![CDATA[<p>fehler gefunden... hatte n doofes include am anfang der datei (include der test.h) in der ringbuffer.h...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1594594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1594594</guid><dc:creator><![CDATA[escapete]]></dc:creator><pubDate>Tue, 07 Oct 2008 06:50:11 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung template klasse als attribut on Tue, 07 Oct 2008 13:16:21 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">~ringbuffer(){
        #ifdef DEBUG_RING_BUFFER
            cout &lt;&lt; &quot;Template RingBuffer Destructor&quot; &lt;&lt; endl;
        #endif    
        delete []buffer;
    }
</code></pre>
<p>Ob das <code>delete[]</code> so eine gute Idee ist...</p>
<p>Ebenso das hier:</p>
<pre><code class="language-cpp">memcpy(buffer + (writePointer), data, sizeof(kind)*length);
</code></pre>
<p>Was passiert, wenn <code>kind</code> ein Typ ist, der selbst Objekte auf dem Heap via Konstruktor anlegt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1594825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1594825</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 07 Oct 2008 13:16:21 GMT</pubDate></item><item><title><![CDATA[Reply to Verwendung template klasse als attribut on Tue, 07 Oct 2008 14:14:12 GMT]]></title><description><![CDATA[<p>merke: benutze NIE memcpy bei Typen die keine PODs sind. Also auch nicht bei Template-Parametern die non-POD Klassen sein können. Für solche Zwecke kann man in C++ eigentlich immer (auch für PODs) std::copy benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1594880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1594880</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 07 Oct 2008 14:14:12 GMT</pubDate></item></channel></rss>