<?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[Cannot appear in a constant expression]]></title><description><![CDATA[<p>Hallo</p>
<p>Bin gerade ein bisschen am Verzweifeln. Muss auch dazu sagen, dass ich relativ neu in der OOP bin.</p>
<p>Warum geht im Konstruktor Folgendes:</p>
<pre><code class="language-cpp">const unsigned int dimension = 4;
typedef itk::Image&lt; TimeStepExtractorFilter::ImagePixelType, dimension &gt; OutputImageType;
</code></pre>
<p>aber Folgendes nicht:</p>
<pre><code class="language-cpp">const unsigned int dimension = m_OutputDimension;
typedef itk::Image&lt; TimeStepExtractorFilter::ImagePixelType, dimension &gt; OutputImageType;
</code></pre>
<p>Der Compiler bringt mir dann immer folgenden Fehler:</p>
<p>In file included from /home/erik/workspace/ITKSeries/timeStepExtractorFilter.h:57,<br />
from /home/erik/workspace/ITKSeries/main.cxx:9:<br />
/home/erik/workspace/ITKSeries/timeStepExtractorFilter.txx: In constructor ‘TimeStepExtractorFilter&lt;TImage&gt;::TimeStepExtractorFilter()’:<br />
/home/erik/workspace/ITKSeries/timeStepExtractorFilter.txx:23: error: ‘dimension’ cannot appear in a constant-expression<br />
/home/erik/workspace/ITKSeries/timeStepExtractorFilter.txx:23: error: template argument 2 is invalid<br />
/home/erik/workspace/ITKSeries/timeStepExtractorFilter.txx:23: error: invalid type in declaration before ‘;’ token<br />
make[2]: *** [CMakeFiles/ITKSeries.dir/main.o] Error 1<br />
make[1]: *** [CMakeFiles/ITKSeries.dir/all] Error 2<br />
make: *** [all] Error 2</p>
<p>Die Headerdatei:</p>
<pre><code class="language-cpp">#ifndef TIMESTEPEXTRACTORFILTER_H_
#define TIMESTEPEXTRACTORFILTER_H_

#include &quot;itkImage.h&quot;
#include &quot;timeStepExtractorFilter.h&quot;

template&lt; class TImage&gt;
class TimeStepExtractorFilter
{

public:
	TimeStepExtractorFilter();
	//virtual ~timeStepExtractorFilter();
	typedef TimeStepExtractorFilter Self;

	typedef TImage									InputImageType;
	typedef typename InputImageType::Pointer 		ImagePointer;
	typedef typename InputImageType::RegionType 	ImageRegionType;
	typedef typename InputImageType::SizeType		ImageSizeType;
	typedef typename InputImageType::IndexType		ImageIndexType;
	typedef typename InputImageType::PixelType		ImagePixelType;

	void Start( void );

	//setter methods
	void SetSliceNumber( unsigned int );
	void SetInputImage( ImagePointer );

	//getter methods
	unsigned int GetSliceNumber( void );

private:
	unsigned int m_sliceNumber;
	unsigned int m_InputDimension;
	unsigned int m_OutputDimension;

	ImagePointer m_InputImage;
	ImageRegionType m_InputRegion;
};

#include &quot;timeStepExtractorFilter.txx&quot;
#endif /* TIMESTEPEXTRACTORFILTER_H_ */
</code></pre>
<p>Ich muss den typedef doch im Konstruktor machen, wenn die dazu benötigte Variable m_OutputDimension erst da ermittelt werden kann. Und m_OutoutDimension muss ich ja schon in der Headerdatei deklarieren. Allerdings kann ich das nicht mit const machen.<br />
Ich steh grad irgendwie aufm Schlauch. Kann mir vielleicht einer helfen?</p>
<p>Danke euch!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/241182/cannot-appear-in-a-constant-expression</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 16:50:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/241182.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 17 May 2009 08:37:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Cannot appear in a constant expression on Sun, 17 May 2009 08:37:31 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Bin gerade ein bisschen am Verzweifeln. Muss auch dazu sagen, dass ich relativ neu in der OOP bin.</p>
<p>Warum geht im Konstruktor Folgendes:</p>
<pre><code class="language-cpp">const unsigned int dimension = 4;
typedef itk::Image&lt; TimeStepExtractorFilter::ImagePixelType, dimension &gt; OutputImageType;
</code></pre>
<p>aber Folgendes nicht:</p>
<pre><code class="language-cpp">const unsigned int dimension = m_OutputDimension;
typedef itk::Image&lt; TimeStepExtractorFilter::ImagePixelType, dimension &gt; OutputImageType;
</code></pre>
<p>Der Compiler bringt mir dann immer folgenden Fehler:</p>
<p>In file included from /home/erik/workspace/ITKSeries/timeStepExtractorFilter.h:57,<br />
from /home/erik/workspace/ITKSeries/main.cxx:9:<br />
/home/erik/workspace/ITKSeries/timeStepExtractorFilter.txx: In constructor ‘TimeStepExtractorFilter&lt;TImage&gt;::TimeStepExtractorFilter()’:<br />
/home/erik/workspace/ITKSeries/timeStepExtractorFilter.txx:23: error: ‘dimension’ cannot appear in a constant-expression<br />
/home/erik/workspace/ITKSeries/timeStepExtractorFilter.txx:23: error: template argument 2 is invalid<br />
/home/erik/workspace/ITKSeries/timeStepExtractorFilter.txx:23: error: invalid type in declaration before ‘;’ token<br />
make[2]: *** [CMakeFiles/ITKSeries.dir/main.o] Error 1<br />
make[1]: *** [CMakeFiles/ITKSeries.dir/all] Error 2<br />
make: *** [all] Error 2</p>
<p>Die Headerdatei:</p>
<pre><code class="language-cpp">#ifndef TIMESTEPEXTRACTORFILTER_H_
#define TIMESTEPEXTRACTORFILTER_H_

#include &quot;itkImage.h&quot;
#include &quot;timeStepExtractorFilter.h&quot;

template&lt; class TImage&gt;
class TimeStepExtractorFilter
{

public:
	TimeStepExtractorFilter();
	//virtual ~timeStepExtractorFilter();
	typedef TimeStepExtractorFilter Self;

	typedef TImage									InputImageType;
	typedef typename InputImageType::Pointer 		ImagePointer;
	typedef typename InputImageType::RegionType 	ImageRegionType;
	typedef typename InputImageType::SizeType		ImageSizeType;
	typedef typename InputImageType::IndexType		ImageIndexType;
	typedef typename InputImageType::PixelType		ImagePixelType;

	void Start( void );

	//setter methods
	void SetSliceNumber( unsigned int );
	void SetInputImage( ImagePointer );

	//getter methods
	unsigned int GetSliceNumber( void );

private:
	unsigned int m_sliceNumber;
	unsigned int m_InputDimension;
	unsigned int m_OutputDimension;

	ImagePointer m_InputImage;
	ImageRegionType m_InputRegion;
};

#include &quot;timeStepExtractorFilter.txx&quot;
#endif /* TIMESTEPEXTRACTORFILTER_H_ */
</code></pre>
<p>Ich muss den typedef doch im Konstruktor machen, wenn die dazu benötigte Variable m_OutputDimension erst da ermittelt werden kann. Und m_OutoutDimension muss ich ja schon in der Headerdatei deklarieren. Allerdings kann ich das nicht mit const machen.<br />
Ich steh grad irgendwie aufm Schlauch. Kann mir vielleicht einer helfen?</p>
<p>Danke euch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711670</guid><dc:creator><![CDATA[Erikly]]></dc:creator><pubDate>Sun, 17 May 2009 08:37:31 GMT</pubDate></item><item><title><![CDATA[Reply to Cannot appear in a constant expression on Sun, 17 May 2009 09:16:11 GMT]]></title><description><![CDATA[<p>Die Werte von Template-Parametern müssen zur Compiezeit feststehen. bei dimension = 4 ist das der Fall, bei dimension = m_OutputDimension nicht, wenn das keine Compilezeitkonstante ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711678</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sun, 17 May 2009 09:16:11 GMT</pubDate></item><item><title><![CDATA[Reply to Cannot appear in a constant expression on Sun, 17 May 2009 10:16:49 GMT]]></title><description><![CDATA[<p>Danke für die Antwort.</p>
<p>Ok, verstanden.</p>
<p>Gibt es eine Möglichkeit, dass ich den Typ(also die Dimension) variabel festlegen kann, weil diese ja erst zur Laufzeit bekannt ist.<br />
Also die Membervariable m_OutoutDimension frag ich erst im Konstruktor ab, und diese ist wiederrum von TImage abhängig.</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711697</guid><dc:creator><![CDATA[Erikly]]></dc:creator><pubDate>Sun, 17 May 2009 10:16:49 GMT</pubDate></item><item><title><![CDATA[Reply to Cannot appear in a constant expression on Sun, 17 May 2009 10:22:59 GMT]]></title><description><![CDATA[<p>Erikly schrieb:</p>
<blockquote>
<p>Gibt es eine Möglichkeit, dass ich den Typ(also die Dimension) variabel festlegen kann, weil diese ja erst zur Laufzeit bekannt ist.</p>
</blockquote>
<p>Mit Templates nicht.</p>
<p>Was du aber tun kannst, ist dynamische Speicherverwaltung, zum Beispiel mit <a href="http://magazin.c-plusplus.net/artikel/Aufbau%20der%20STL%20-%20Teil%201%3A%20Container" rel="nofollow">STL-Containern</a>. Dann übergibst du die Grösse nicht als Template-, sondern als Konstruktorparameter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711704</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 17 May 2009 10:22:59 GMT</pubDate></item><item><title><![CDATA[Reply to Cannot appear in a constant expression on Sun, 17 May 2009 15:32:43 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich nochmal.</p>
<p>Ähm so richtig weiß ich ehrlich gesagt nicht, was gemeint ist.</p>
<p>Ich würde auch ungern Konstruktorparameter verwenden.</p>
<p>Kann man das Problem vielleicht sogar über Makros lösen, oder lieg ich da falsch?</p>
<p>Wäre cool, wenn mir einer eine kleine Hilfestellung geben könnte.</p>
<p>Grüße, Erik!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711819</guid><dc:creator><![CDATA[Erikly]]></dc:creator><pubDate>Sun, 17 May 2009 15:32:43 GMT</pubDate></item><item><title><![CDATA[Reply to Cannot appear in a constant expression on Sun, 17 May 2009 15:48:10 GMT]]></title><description><![CDATA[<p>Erikly schrieb:</p>
<blockquote>
<p>Wäre cool, wenn mir einer eine kleine Hilfestellung geben könnte.</p>
</blockquote>
<p>Und wie? Wir haben keine Informationen, mit welchen wir dir helfen könnten. Wir können nur sagen, dass man keine variable Werte als Templateparameter übergeben kann. Solange der Wert von <code>m_OutputDimension</code> nicht zur Kompilezeit bekannt ist, kannst du es nicht als zweiten Templateparameter an <code>itk::Image</code> übergeben.</p>
<p>Grüssli</p>
<p>PS: Du kennst die Standardbibliothek mit den Standardcontainer aber schon? Also du werkelst da nicht mit Templates rum, bevor du die C++ Bibliothek kennen gelernt hast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711831</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 17 May 2009 15:48:10 GMT</pubDate></item><item><title><![CDATA[Reply to Cannot appear in a constant expression on Sun, 17 May 2009 16:07:25 GMT]]></title><description><![CDATA[<p>Erikly schrieb:</p>
<blockquote>
<p>...Ähm so richtig weiß ich ehrlich gesagt nicht, was gemeint ist....</p>
</blockquote>
<p>Hi,</p>
<p>ich vermute, Dein Problem hat nicht wirklich was mit templates zu tun, sondern mit der Verwendung des template-Parameters &quot;dimension&quot;.<br />
Die sehen wir aber nicht (vllt. bin ich nur blind ?) und so können wir hier nur raten.</p>
<p>Mein erster Lottotipp:<br />
Du hast sowas wie</p>
<pre><code class="language-cpp">// in der Deklaration
irgendeinTyp var_name[dimension];

// ... irgendwo initialisieren.
for(i=0; i&lt;dimension; ++i) var_name[i] = irgendeinWert;
</code></pre>
<p>Dann wäre ein guter Ansatz</p>
<pre><code class="language-cpp">// in der Deklaration
std::vector&lt;irgendeinTyp&gt; var_name;

// ... irgendwo initialisieren.
for(i=0; i&lt;dimension; ++i) var_name.push_back(irgendeinWert);

// ...oder
var_name.resize(dimension);
for(i=0; i&lt;dimension; ++i) var_name[i] = irgendeinWert;
</code></pre>
<p>Vorteil: Bei der Konstruktion Deines umgebenden Objektes muss die dimension noch gar nicht unbedingt feststehen, sondern Du kannst sie nach Belieben zu Lebnzeiten des Objekts ändern.</p>
<p>Was hast Du eigentlich gegen Ctor-Parameter?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711841</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sun, 17 May 2009 16:07:25 GMT</pubDate></item><item><title><![CDATA[Reply to Cannot appear in a constant expression on Sun, 17 May 2009 16:34:40 GMT]]></title><description><![CDATA[<p>Erikly schrieb:</p>
<blockquote>
<p>Ähm so richtig weiß ich ehrlich gesagt nicht, was gemeint ist.</p>
</blockquote>
<p>Immer noch das Gleiche: Dass die Variablen, die als Template-Argumente eingesetzt werden, konstante Ausdrücke sind, also zur Compilezeit bekannte Werte haben müssen.</p>
<p>Erikly schrieb:</p>
<blockquote>
<p>Ich würde auch ungern Konstruktorparameter verwenden.</p>
</blockquote>
<p>Warum das?</p>
<p>Erikly schrieb:</p>
<blockquote>
<p>Kann man das Problem vielleicht sogar über Makros lösen, oder lieg ich da falsch?</p>
</blockquote>
<p>Makros bringen da nichts, eher noch weniger, da sie sogar noch vor dem Kompilieren aufgelöst werden.</p>
<p>Erikly schrieb:</p>
<blockquote>
<p>Wäre cool, wenn mir einer eine kleine Hilfestellung geben könnte.</p>
</blockquote>
<p>Wie gesagt wäre die STL eine Methode, mehrere Objekte dynamisch zu verwalten. Wenn du C++ effizient lernen willst, solltest du dich vielleicht einmal damit beschäftigen. Simon2 hat in seinem Post auch einiges erklärt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711853</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 17 May 2009 16:34:40 GMT</pubDate></item></channel></rss>