<?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[Nicht-Templateklasse mit Template-Basisklasse -&amp;gt; Konstruktor in Quelltextdatei]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Basisklasse:</p>
<pre><code class="language-cpp">template&lt;class container_type&gt;
class Data
{
  //...
};
</code></pre>
<p>Nun leite ich mir davon eine Klasse Image ab:</p>
<pre><code class="language-cpp">class Image : Data&lt;std::vector&lt;Triple&lt;int,int,int&gt; &gt; &gt;
</code></pre>
<p>(Triple ist eine selbstgeschriebene Klasse, die nichts anderes macht als std::pair, bloß halt mit drei Werten statt zwei)</p>
<p>Eigentlich kann ich jetzt davon ausgehen, dass die Klasse Image <strong>kein</strong> Template ist.</p>
<p>Zum Verständnis noch vor dem Problem folgendes (Member von Image):</p>
<pre><code class="language-cpp">public:

enum Colorspace
{
  CS_RGB,
  CS_YCrCb
};

//...

typedef std::vector&lt;Triple&lt;int,int,int&gt; &gt; ImageVector;
</code></pre>
<p>Außerdem befindet sich alles im Namespace Container.</p>
<p>Das alles steht in der Headerdatei. Problem: Ich möchte die Konstruktoren der Klasse Image, wie für Nicht-Templates üblich, in die CPP-Datei schreiben.</p>
<p>Also sage ich im Header:</p>
<pre><code class="language-cpp">Image(const ImageVector&amp; image,int height,int width,Colorspace colorspace);
Image(const std::vector&lt;ImageVector&gt;&amp; image,Colorspace colorspace);
</code></pre>
<p>(mglw. liegt hier schon der Fehler?)</p>
<p>Quelltextdatei:</p>
<pre><code class="language-cpp">Container::Image::Image(const Container::Image::ImageVector&amp; image,int height,int width,Container::Image::Colorspace colorspace)
   : Data&lt;ImageVector&gt;(image), width(width), height(height), colorspace(colorspace)
  { }
</code></pre>
<p>-&gt; und da ist der Fehler.</p>
<p>bcc32 meldet in der Zeile ab dem &quot;:&quot; (Initialisierung)</p>
<pre><code>[C++ Fehler] data.cpp(17): E2038 Deklaration oder Definition von 'Container::Image::Image(const std::vector&lt;Triple&lt;int,int,int&gt; blabla &gt; &amp;,int,int,Container::Image::Colorspace)' hier nicht zulässig
</code></pre>
<p>Der entsprechende &quot;Basis&quot;-Konstruktor</p>
<pre><code class="language-cpp">Data(const container_type&amp; content) : content(content) { }
</code></pre>
<p>ist vorhanden.</p>
<p>Wie kann ich dieses Problem lösen?</p>
<p>Vielen Dank schon einmal,</p>
<p>MfG Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/168298/nicht-templateklasse-mit-template-basisklasse-gt-konstruktor-in-quelltextdatei</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 09:10:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/168298.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 20 Dec 2006 16:36:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Nicht-Templateklasse mit Template-Basisklasse -&amp;gt; Konstruktor in Quelltextdatei on Wed, 20 Dec 2006 16:36:13 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Basisklasse:</p>
<pre><code class="language-cpp">template&lt;class container_type&gt;
class Data
{
  //...
};
</code></pre>
<p>Nun leite ich mir davon eine Klasse Image ab:</p>
<pre><code class="language-cpp">class Image : Data&lt;std::vector&lt;Triple&lt;int,int,int&gt; &gt; &gt;
</code></pre>
<p>(Triple ist eine selbstgeschriebene Klasse, die nichts anderes macht als std::pair, bloß halt mit drei Werten statt zwei)</p>
<p>Eigentlich kann ich jetzt davon ausgehen, dass die Klasse Image <strong>kein</strong> Template ist.</p>
<p>Zum Verständnis noch vor dem Problem folgendes (Member von Image):</p>
<pre><code class="language-cpp">public:

enum Colorspace
{
  CS_RGB,
  CS_YCrCb
};

//...

typedef std::vector&lt;Triple&lt;int,int,int&gt; &gt; ImageVector;
</code></pre>
<p>Außerdem befindet sich alles im Namespace Container.</p>
<p>Das alles steht in der Headerdatei. Problem: Ich möchte die Konstruktoren der Klasse Image, wie für Nicht-Templates üblich, in die CPP-Datei schreiben.</p>
<p>Also sage ich im Header:</p>
<pre><code class="language-cpp">Image(const ImageVector&amp; image,int height,int width,Colorspace colorspace);
Image(const std::vector&lt;ImageVector&gt;&amp; image,Colorspace colorspace);
</code></pre>
<p>(mglw. liegt hier schon der Fehler?)</p>
<p>Quelltextdatei:</p>
<pre><code class="language-cpp">Container::Image::Image(const Container::Image::ImageVector&amp; image,int height,int width,Container::Image::Colorspace colorspace)
   : Data&lt;ImageVector&gt;(image), width(width), height(height), colorspace(colorspace)
  { }
</code></pre>
<p>-&gt; und da ist der Fehler.</p>
<p>bcc32 meldet in der Zeile ab dem &quot;:&quot; (Initialisierung)</p>
<pre><code>[C++ Fehler] data.cpp(17): E2038 Deklaration oder Definition von 'Container::Image::Image(const std::vector&lt;Triple&lt;int,int,int&gt; blabla &gt; &amp;,int,int,Container::Image::Colorspace)' hier nicht zulässig
</code></pre>
<p>Der entsprechende &quot;Basis&quot;-Konstruktor</p>
<pre><code class="language-cpp">Data(const container_type&amp; content) : content(content) { }
</code></pre>
<p>ist vorhanden.</p>
<p>Wie kann ich dieses Problem lösen?</p>
<p>Vielen Dank schon einmal,</p>
<p>MfG Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195509</guid><dc:creator><![CDATA[cbuilder]]></dc:creator><pubDate>Wed, 20 Dec 2006 16:36:13 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht-Templateklasse mit Template-Basisklasse -&amp;gt; Konstruktor in Quelltextdatei on Wed, 20 Dec 2006 16:53:41 GMT]]></title><description><![CDATA[<p>Der Fehlermeldung nach würd ich sagen, du hast irgendwo ein Semikolon oder eine Klammer vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195521</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 20 Dec 2006 16:53:41 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht-Templateklasse mit Template-Basisklasse -&amp;gt; Konstruktor in Quelltextdatei on Wed, 20 Dec 2006 17:04:23 GMT]]></title><description><![CDATA[<p>Header:</p>
<pre><code class="language-cpp">//...

#include &quot;util.h&quot;

namespace Shannon
{

  namespace Container
  {

    template&lt;class container_type&gt;
    class Data
    {
      protected:
        container_type content;

      public:
        Data(const container_type&amp; content) : content(content) { }

        virtual container_type&amp; getText() = 0;
        virtual const container_type&amp; getText() const = 0;
        virtual Data&amp; setText(const container_type&amp; newContent) = 0;
    };

    template&lt;class Ch,class Tr=std::char_traits&lt;Ch&gt;,class A=std::allocator&lt;Ch&gt; &gt;
    class Text : public Data&lt;std::basic_string&lt;Ch,Tr,A&gt; &gt;
    {
      protected:
        typedef std::basic_string&lt;Ch,Tr,A&gt; string_type;

      public:
        Text(const string_type&amp; content) : Data(content) { };

        string_type&amp; getText()
        {
          return content;
        }

        const string_type&amp; getText() const
        {
          return content;
        }

        Text&amp; setText(const string_type&amp; newContent)
        {
          Data::content = newContent;
          return this;
        }
    };

    class Image : public Data&lt;std::vector&lt;Triple&lt;int,int,int&gt; &gt; &gt;
    {
      public:
        enum Colorspace
        {
          CS_RGB,
          CS_YCrCb
        }; 

      private:
        int height,width;

      protected:
        typedef std::vector&lt;Triple&lt;int,int,int&gt; &gt; ImageVector;
        Colorspace colorspace;

      public:
        Image(const ImageVector&amp; image,int height,int width,Colorspace colorspace);
        Image(const std::vector&lt;ImageVector&gt;&amp; image,Colorspace colorspace);
    };

  }

}

#endif
</code></pre>
<p>Quelltext:</p>
<pre><code class="language-cpp">namespace Shannon
{

  Container::Image::Image(const Container::Image::ImageVector&amp; image,int height,int width,Container::Image::Colorspace colorspace)
   : Data&lt;ImageVector&gt;(image), width(width), height(height), colorspace(colorspace)
  { }

  Container::Image::Image(const std::vector&lt;Container::Image::ImageVector&gt;&amp; image,Colorspace colorspace)
   : Data&lt;ImageVector&gt;(ImageVector()), colorspace(colorspace), width(0), height(0)
  {

  }

} // End Namespace
</code></pre>
<p>Jetzt habe ich das mal in den g++ gesteckt:</p>
<pre><code>In file included from D:\Eigene Dateien\Projekte &amp; data.cpp:6:
data.h: In constructor `Shannon::Container::Text&lt;Ch, Tr, A&gt;::Text(const std::basic_string&lt;_CharT, _Traits, _Alloc&gt;&amp;)':
data.h:39: error: class `Shannon::Container::Text&lt;Ch, Tr, A&gt;' does not have any field named `Data'
data.h: In member function `std::basic_string&lt;_CharT, _Traits, _Alloc&gt;&amp; Shannon::Container::Text&lt;Ch, Tr, A&gt;::getText()':
data.h:43: error: `content' undeclared (first use this function)
data.h: In member function `const std::basic_string&lt;_CharT, _Traits, _Alloc&gt;&amp; Shannon::Container::Text&lt;Ch, Tr, A&gt;::getText() const':
data.h:48: error: `content' undeclared (first use this function)
data.h: In member function `Shannon::Container::Text&lt;Ch, Tr, A&gt;&amp; Shannon::Container::Text&lt;Ch, Tr, A&gt;::setText(const std::basic_string&lt;_CharT, _Traits, _Alloc&gt;&amp;)':
data.h:53: error: `content' undeclared (first use this function)
</code></pre>
<p>Jetzt bin ich total konfus... Eine abgeleitete Klasse erhält doch Zugriff auf die Member der Basisklasse. Die Basisklasse enthält content, also darf ich doch drauf zugreifen, oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Und der Aufruf des Konstruktors einer Basisklasse wird doch auch so gemacht, wie ich es geschrieben habe, oder nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195530</guid><dc:creator><![CDATA[cbuilder]]></dc:creator><pubDate>Wed, 20 Dec 2006 17:04:23 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht-Templateklasse mit Template-Basisklasse -&amp;gt; Konstruktor in Quelltextdatei on Wed, 20 Dec 2006 20:26:53 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich sehe spontan zwei Fehler: Einmal fehlen dir die Template-Argumentlisten. Z.B. hier:</p>
<pre><code class="language-cpp">Text(const string_type&amp; content) : Data(content) { };
</code></pre>
<p>Richtig wäre:</p>
<pre><code class="language-cpp">Text(const string_type&amp; content) : Data&lt;std::basic_string&lt;Ch,Tr,A&gt; &gt;(content) { }
</code></pre>
<p>Besser:</p>
<pre><code class="language-cpp">template&lt;class Ch,class Tr=std::char_traits&lt;Ch&gt;,class A=std::allocator&lt;Ch&gt; &gt;
    class Text : public Data&lt;std::basic_string&lt;Ch,Tr,A&gt; &gt;
    {
      protected:
        typedef std::basic_string&lt;Ch,Tr,A&gt; string_type;
        typedef Data&lt;std::basic_string&lt;Ch,Tr,A&gt; &gt; base;
      public:
        Text(const string_type&amp; content) : base(content) { }
        ...
</code></pre>
<p>Außerdem musst du Namen aus abhängigen Basisklassen qualifizieren, da sie sonst nicht gefunden werden (-&gt; Suchfunktion):</p>
<p>Statt:</p>
<pre><code class="language-cpp">string_type&amp; getText()
{
    return content;
}
</code></pre>
<pre><code class="language-cpp">string_type&amp; getText()
{
    return this-&gt;content;
}
</code></pre>
<p>setText muss zu:</p>
<pre><code class="language-cpp">Text&amp; setText(const string_type&amp; newContent) {
 base::content = newContent;
 // oder
 // this-&gt;content = newContent;
 return this;
}
</code></pre>
<p>werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195673</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Wed, 20 Dec 2006 20:26:53 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht-Templateklasse mit Template-Basisklasse -&amp;gt; Konstruktor in Quelltextdatei on Thu, 21 Dec 2006 06:40:36 GMT]]></title><description><![CDATA[<p>Danke, das behebt schon mal einiges. Jetzt ist aber immer noch das alte Problem:</p>
<pre><code class="language-cpp">Container::Image::Image(const Container::Image::ImageVector&amp; image,int height,int width,Container::Image::Colorspace colorspace)
   : base(image), width(width), height(height), colorspace(colorspace)
  { }
</code></pre>
<p>Das habe ich jetzt in der Quelltextdatei verändert. Aber die Fehlermeldung, dass die Definition nicht zulässig sei, kommt immer noch. Muss ich das etwa in den Header schreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195808</guid><dc:creator><![CDATA[cbuilder]]></dc:creator><pubDate>Thu, 21 Dec 2006 06:40:36 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht-Templateklasse mit Template-Basisklasse -&amp;gt; Konstruktor in Quelltextdatei on Thu, 21 Dec 2006 15:31:43 GMT]]></title><description><![CDATA[<p>Merkwürdig ist ja, dass g++ nichts mehr zu meckern hat, der bcc32 aber sehr wohl...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1196187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1196187</guid><dc:creator><![CDATA[cbuilder]]></dc:creator><pubDate>Thu, 21 Dec 2006 15:31:43 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht-Templateklasse mit Template-Basisklasse -&amp;gt; Konstruktor in Quelltextdatei on Thu, 21 Dec 2006 15:44:06 GMT]]></title><description><![CDATA[<p>Ich kann hier nichts falsches mehr entdecken. Ich vermute, dass bcc sich daran stört, dass sich die Definition nicht im die Klassendefinition unmittelbar umschließenden Namensraum befindet. Der Standard ist hier eindeutig und lässt das zu. Also ist das möglicherweise ein Compilerbug. Selbst der Comeau-online Compiler hat hier keine Probleme. Übrigens kannst du bei der Definition auf die Verwendung qualifizierter Namen für die Argumenttypen verzichten, denn der entsprechende Namensraum ist bereits durch die Nennung der Funktion selbst bestimmt. es genügt also:</p>
<pre><code class="language-cpp">Shannon::Container::Image::Image(const ImageVector&amp; image,int height,int width,Colorspace colorspace)
   : Data&lt;ImageVector&gt;(image), width(width), height(height), colorspace(colorspace)
  { }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1196191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1196191</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 21 Dec 2006 15:44:06 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht-Templateklasse mit Template-Basisklasse -&amp;gt; Konstruktor in Quelltextdatei on Thu, 21 Dec 2006 15:54:19 GMT]]></title><description><![CDATA[<p>Man mag es nicht glauben, aber in deiner Variante nimmt es der bcc! Oh mann, ist das blöd. Darauf soll man nun kommen... Mein Problem war jetzt, dass ich das eigentlich für zu lang halte: Shannon::Data::Image::Image usw. usf. Weil ich in Bibliotheken gerne ein Namespace mit dem Bibliotheksnamen und dann thematische Sub-Namespaces benutze, schreibe ich in die Quelltextdateien halt um die Funktionen schnell die NS-Definition drumrum. Aber wenns ihn stört, dann halt so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1196202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1196202</guid><dc:creator><![CDATA[cbuilder]]></dc:creator><pubDate>Thu, 21 Dec 2006 15:54:19 GMT</pubDate></item></channel></rss>