<?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[Template Funktion]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich war gerade kurz davor 3 Funktionen zu implementieren, die alle das gleiche machen, bis auf dass bei dem Teil, an dem eine neue Instanz einer Templateklasse erzeugt eine 1,2 oder 3 übergebeben wird. Da kam mir die glorreiche Idee daraus ebenfalls ein Template zu machen:</p>
<pre><code>template&lt;unsigned int DIM&gt;
void vtk2itk(vtkImageData* vtkOutImage)
{    
    const char* scalarTypeString = vtkOutImage-&gt;GetScalarTypeAsString();
    if (strcmp(&quot;VTK_CHAR&quot;, scalarTypeString) == 0) {
	typedef char scalarType;
	typedef itk::Image&lt;scalarType, DIM&gt;	InputType;
	typedef itk::VTKImageImport&lt;InputType&gt; 	ImageImportType;
	ImageImportType::Pointer itkImporter;
	itkImporter = ImageImportType::New();
	connectITKImporter(itkImporter, vtkOutImage);
    } else if (strcmp(&quot;VTK_UNSIGNED_CHAR&quot;, scalarTypeString) == 0) {
	typedef unsigned char scalarType;
        ...
}
</code></pre>
<p>Leider kommt hier die wirklich merkwürdige Fehlermeldung:</p>
<pre><code>/home/christian/programming/pv-plugins/vtk2itk2vtk/vtk2itk2vtk.cxx: In function 'void vtk2itk(vtkImageData*)':
/home/christian/programming/pv-plugins/vtk2itk2vtk/vtk2itk2vtk.cxx:9: error: expected `;' before 'itkImporter'                                                                                                            
/home/christian/programming/pv-plugins/vtk2itk2vtk/vtk2itk2vtk.cxx:10: error: 'itkImporter' was not declared in this scope
</code></pre>
<p>Sehr merkwürdig deswegen, weil alles problemlos kompiliert, wenn ich die Template Deklaration weglasse und das ganze so schreibe:</p>
<pre><code>void vtk2itk(vtkImageData* vtkOutImage)
{    
    #define DIM 3
    const char* scalarTypeString = vtkOutImage-&gt;GetScalarTypeAsString();
    if (strcmp(&quot;VTK_CHAR&quot;, scalarTypeString) == 0) {
	typedef char scalarType;
	typedef itk::Image&lt;scalarType, DIM&gt;	InputType;
	typedef itk::VTKImageImport&lt;InputType&gt; 	ImageImportType;
	ImageImportType::Pointer itkImporter;
	itkImporter = ImageImportType::New();
</code></pre>
<p>Ich muss zugeben, das ist das erste Mal, dass ich mich an sowas versuche. Aber nachdem ich mich nun stundenlang nach Beispielen umgesehen und mir 3 Mal das Kapitel über Templates in meinem O'Reilly durchgelesen haben (nirgends finde ich übrigens so ein &quot;einfaches&quot; Template, wo nur ein int übergeben wird), weiß ich nicht mehr weiter...</p>
<p>Hat jemand einen guten Rat?</p>
<p>Viele Grüße,<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261134/template-funktion</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 08:25:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261134.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 14 Feb 2010 11:34:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template Funktion on Sun, 14 Feb 2010 11:38:20 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich war gerade kurz davor 3 Funktionen zu implementieren, die alle das gleiche machen, bis auf dass bei dem Teil, an dem eine neue Instanz einer Templateklasse erzeugt eine 1,2 oder 3 übergebeben wird. Da kam mir die glorreiche Idee daraus ebenfalls ein Template zu machen:</p>
<pre><code>template&lt;unsigned int DIM&gt;
void vtk2itk(vtkImageData* vtkOutImage)
{    
    const char* scalarTypeString = vtkOutImage-&gt;GetScalarTypeAsString();
    if (strcmp(&quot;VTK_CHAR&quot;, scalarTypeString) == 0) {
	typedef char scalarType;
	typedef itk::Image&lt;scalarType, DIM&gt;	InputType;
	typedef itk::VTKImageImport&lt;InputType&gt; 	ImageImportType;
	ImageImportType::Pointer itkImporter;
	itkImporter = ImageImportType::New();
	connectITKImporter(itkImporter, vtkOutImage);
    } else if (strcmp(&quot;VTK_UNSIGNED_CHAR&quot;, scalarTypeString) == 0) {
	typedef unsigned char scalarType;
        ...
}
</code></pre>
<p>Leider kommt hier die wirklich merkwürdige Fehlermeldung:</p>
<pre><code>/home/christian/programming/pv-plugins/vtk2itk2vtk/vtk2itk2vtk.cxx: In function 'void vtk2itk(vtkImageData*)':
/home/christian/programming/pv-plugins/vtk2itk2vtk/vtk2itk2vtk.cxx:9: error: expected `;' before 'itkImporter'                                                                                                            
/home/christian/programming/pv-plugins/vtk2itk2vtk/vtk2itk2vtk.cxx:10: error: 'itkImporter' was not declared in this scope
</code></pre>
<p>Sehr merkwürdig deswegen, weil alles problemlos kompiliert, wenn ich die Template Deklaration weglasse und das ganze so schreibe:</p>
<pre><code>void vtk2itk(vtkImageData* vtkOutImage)
{    
    #define DIM 3
    const char* scalarTypeString = vtkOutImage-&gt;GetScalarTypeAsString();
    if (strcmp(&quot;VTK_CHAR&quot;, scalarTypeString) == 0) {
	typedef char scalarType;
	typedef itk::Image&lt;scalarType, DIM&gt;	InputType;
	typedef itk::VTKImageImport&lt;InputType&gt; 	ImageImportType;
	ImageImportType::Pointer itkImporter;
	itkImporter = ImageImportType::New();
</code></pre>
<p>Ich muss zugeben, das ist das erste Mal, dass ich mich an sowas versuche. Aber nachdem ich mich nun stundenlang nach Beispielen umgesehen und mir 3 Mal das Kapitel über Templates in meinem O'Reilly durchgelesen haben (nirgends finde ich übrigens so ein &quot;einfaches&quot; Template, wo nur ein int übergeben wird), weiß ich nicht mehr weiter...</p>
<p>Hat jemand einen guten Rat?</p>
<p>Viele Grüße,<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1855357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1855357</guid><dc:creator><![CDATA[quaid]]></dc:creator><pubDate>Sun, 14 Feb 2010 11:38:20 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktion on Sun, 14 Feb 2010 11:43:00 GMT]]></title><description><![CDATA[<p>Das übliche Problem, dass der Typ <code>ImageImportType::Pointer</code> von einem Template-Parameter abhängt und deshalb vom Compiler nicht als Typ erkannt werden kann. <code>typename ImageImportType::Pointer</code> sollte das Problem lösen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1855359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1855359</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 14 Feb 2010 11:43:00 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktion on Sun, 14 Feb 2010 12:06:53 GMT]]></title><description><![CDATA[<p>Danke für die schnelle Antwort! Das freut mich, dass es ein Standardproblem ist, aber wo soll ich genau dieses &quot;typename ...&quot; hinschreiben? In die Templatedefinition oder mitten in den Code?</p>
<pre><code>typename ImageImportType::Pointer;
</code></pre>
<p>Am Anfang der Funktion ist jedenfalls schonmal falsch:</p>
<pre><code>error: declaration does not declare anything
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1855372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1855372</guid><dc:creator><![CDATA[quaid]]></dc:creator><pubDate>Sun, 14 Feb 2010 12:06:53 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktion on Sun, 14 Feb 2010 12:13:10 GMT]]></title><description><![CDATA[<p>Siehe <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-261050-and-highlight-is-*typename*.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-261050-and-highlight-is-*typename*.html</a></p>
<p>Also ja, mitten in den Code:</p>
<pre><code class="language-cpp">typedef itk::Image&lt;scalarType, DIM&gt;    InputType;
    typedef itk::VTKImageImport&lt;InputType&gt;     ImageImportType;
    typename ImageImportType::Pointer itkImporter;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1855377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1855377</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 14 Feb 2010 12:13:10 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktion on Sun, 14 Feb 2010 12:26:33 GMT]]></title><description><![CDATA[<p>Oh, hrrhrr... :p Hatte ich schon gemacht, aber halt nur an einer Stelle eingefügt, hinter dem ... kommt das ganze ja noch 10 Mal, also hat er sich dann immernoch 9 Mal beschwert.</p>
<p>Apropos, meine Funktion sieht jetzt so aus:</p>
<pre><code>const char* scalarTypeString = vtkOutImage-&gt;GetScalarTypeAsString();

    if (strcmp(&quot;VTK_CHAR&quot;, scalarTypeString) == 0) {
	typedef char scalarType;
	typedef itk::Image&lt;scalarType, DIM&gt;	InputType;
	typedef itk::VTKImageImport&lt;InputType&gt; 	ImageImportType;
	typename ImageImportType::Pointer itkImporter;
	itkImporter = ImageImportType::New();
	connectITKImporter(itkImporter, vtkOutImage);

    } else if (strcmp(&quot;VTK_UNSIGNED_CHAR&quot;, scalarTypeString) == 0) {
	typedef unsigned char scalarType;
	typedef itk::Image&lt;scalarType, DIM&gt;	InputType;
	typedef itk::VTKImageImport&lt;InputType&gt; 	ImageImportType;
	typename ImageImportType::Pointer itkImporter;
	itkImporter = ImageImportType::New();
	connectITKImporter(itkImporter, vtkOutImage);
...und das alles für jeden Datentyp...
</code></pre>
<p>Das kann ich nicht zufällig abkürzen oder? Ich mach ja ne Fallunterscheidung und erst dann den typedef, also ist dieser ja nur in der If-Umgebung gültig. Das ganze itkImport = new... am Schluß, nach den ganzen IFs geht nicht, da meckert er natürlich, dass er den Typ nicht kennt...</p>
<p>Ist aber nicht so wichtig, es läuft ja. Vielen Dank für die schnelle Antwort.</p>
<p>Super Forum hier, bin (mal wieder) begeistert! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1855380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1855380</guid><dc:creator><![CDATA[quaid]]></dc:creator><pubDate>Sun, 14 Feb 2010 12:26:33 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktion on Sun, 14 Feb 2010 13:26:07 GMT]]></title><description><![CDATA[<p>Vielleicht so (ungetestet)?</p>
<pre><code class="language-cpp">struct TypeSelectBase
{
	virtual void callConnect(int dim, vtkImageData* vtkOutImage) = 0;
};

template&lt;typename T&gt;
struct TypeSelect : public TypeSelectBase
{
	virtual void callConnect(int dim, vtkImageData* vtkOutImage)
	{
		typedef T scalarType;
		typedef itk::Image&lt;scalarType, DIM&gt;    InputType;
		typedef itk::VTKImageImport&lt;InputType&gt;     ImageImportType;
		typename ImageImportType::Pointer itkImporter;
		itkImporter = ImageImportType::New();
		connectITKImporter(itkImporter, vtkOutImage); 
	}
};

template&lt;unsigned int DIM&gt;
void vtk2itk(vtkImageData* vtkOutImage)
{
	TypeSelectBase* pointer;
    const char* scalarTypeString = vtkOutImage-&gt;GetScalarTypeAsString();
    if (strcmp(&quot;VTK_CHAR&quot;, scalarTypeString) == 0) {
		pointer = new TypeSelect&lt;char&gt;;
    } else if (strcmp(&quot;VTK_UNSIGNED_CHAR&quot;, scalarTypeString) == 0) {
		pointer = new TypeSelect&lt;unsigned char&gt;;
	}
	...
	pointer-&gt;callConnect(DIM, vtkOutImage);
	delete pointer;
}
</code></pre>
<p>Edit: Moment, das kann so noch nicht klappen.<br />
Edit: Doch, es müsste so klappen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1855396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1855396</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 14 Feb 2010 13:26:07 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktion on Thu, 18 Feb 2010 09:29:08 GMT]]></title><description><![CDATA[<p>Danke, funktioniert alles bestens. Jetzt kann ich auch endlich vernünftig mit Templates umgehen! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857471</guid><dc:creator><![CDATA[quaid]]></dc:creator><pubDate>Thu, 18 Feb 2010 09:29:08 GMT</pubDate></item></channel></rss>