<?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[sorry, unimplemented: mangling nontype_argument_pack]]></title><description><![CDATA[<p>Hallöle,</p>
<p>Sorry für den blöden Threadtitel, aber der Fehler ist so umfangreich, mir ist da nichts besseres eingefallen. Folgendes Szenario: Ich habe angefangen, Boost.Lambda nachzuprogrammieren, alle Operatoren sowie Platzhalter funktionieren bereits. Was mir Probleme bereitet, ist eine Art while Konstrukt.</p>
<p>Hier ein Beispiel, wie das ganze aussehen soll:</p>
<pre><code class="language-cpp">auto f = while_(_0)[--_0];
</code></pre>
<p>Diese Lambda nimmt also das erste Argument und dekrementiert es, bis es 0 ist.</p>
<p>Alle Ausdrücke werden vom CRTP Klassentemplate expression&lt;DerivedType&gt; abgeleitet. while_ ist eine Funktion, die einen solchen Ausdruck nimmt und eine while_expression&lt;CondType&gt; zurückgibt. Für while_expression ist der operator [] überladen, der eine while_body_expression&lt;CondType, BodyType&gt; zurückgibt.</p>
<p>while_body_expression sieht wie folgt aus:</p>
<pre><code class="language-cpp">template &lt;typename Cond, typename Body&gt;
struct while_body_expression : expression&lt;while_body_expression&lt;Cond, Body&gt;&gt;
{
	while_body_expression(Cond cond, Body body)
		: cond(cond), body(body)
	{}

	template &lt;typename... Args&gt;
	void operator () (Args&amp;&amp;... args) const
	{
		while(cond(std::forward&lt;Args&gt;(args)...))
			body(std::forward&lt;Args&gt;(args)...);
	}

private:
	Cond cond;
	Body body;
};
</code></pre>
<p>Wenn ich die oben gegebene Lambda mit dem folgenden Stück Code instanziere und verwende:</p>
<pre><code class="language-cpp">auto f = while_(_0)[--_0];
int i = 20;
f(i);
</code></pre>
<p>, sagt mir der Compiler:</p>
<pre><code class="language-cpp">In file included from ../main.cpp:3:0:
../lambda/arithmetic_ops.hpp: In instantiation of 'decltype (-- declval&lt;Expr&gt;()((forward&lt;Args&gt;)(lambda::prefix_decrement_expression::operator()::args)...)) lambda::prefix_decrement_expression&lt;Expr&gt;::operator()(Args&amp;&amp; ...) const [with Args = {int&amp;}; Expr = lambda::argument_placeholder_expression&lt;0u&gt;; decltype (-- declval&lt;Expr&gt;()((forward&lt;Args&gt;)(lambda::prefix_decrement_expression::operator()::args)...)) = int&amp;]':
../lambda/while.hpp:21:5:   required from 'void lambda::while_body_expression&lt;Cond, Body&gt;::operator()(Args&amp;&amp; ...) const [with Args = {int&amp;}; Cond = lambda::argument_placeholder_expression&lt;0u&gt;; Body = lambda::prefix_decrement_expression&lt;lambda::argument_placeholder_expression&lt;0u&gt; &gt;]'
../main.cpp:14:5:   required from here
../lambda/arithmetic_ops.hpp:22:2: sorry, unimplemented: mangling nontype_argument_pack
</code></pre>
<p>Wobei er in main.cpp auf die Zeile des Aufrufs verweist und in arithmetic_ops.hpp auf die Definition des operator --, die über folgende Makroinstanzierung</p>
<pre><code class="language-cpp">DEFINE_UNARY_EXPRESSION(prefix_decrement, --)
</code></pre>
<p>wie hier zu sehen aussieht:</p>
<pre><code class="language-cpp">#define DEFINE_UNARY_EXPRESSION_TYPE(name, op) \
	template &lt;typename Expr&gt; \
	struct name##_expression : expression&lt;name##_expression&lt;Expr&gt;&gt; \
	{ \
		name##_expression(Expr expr) \
			: expr(expr) \
		{} \
	\
		template &lt;typename... Args&gt; \
		auto operator () (Args&amp;&amp;... args) const \
			-&gt; decltype(op std::declval&lt;Expr&gt;()(std::forward&lt;Args&gt;(args)...)) \
		{ \
			return op expr(std::forward&lt;Args&gt;(args)...); \
		} \
	\
	private: \
		Expr expr; \
	};

#define DEFINE_UNARY_EXPRESSION(name, op) \
	DEFINE_UNARY_EXPRESSION_TYPE(name, op) \
	\
	template &lt;typename Derived&gt; \
	name##_expression&lt;Derived&gt; expression&lt;Derived&gt;::operator op () const \
	{ \
		return name##_expression&lt;Derived&gt;(derived_this()); \
	}
</code></pre>
<p>Dieses Makro definiert einen Typ prefix_decrement_expression und implementiert den in der Basisklasse expression&lt;&gt; deklarierten operator --.</p>
<p>Was mich wurmt, ist, dass die Operatoren alle ohne das while funktionieren. Erst wenn ich ein while in die Lambda einbaue kommen diese Fehler, völlig unabhängig davon, welche Operatoren ich nun in der Lambda verwende. Auch sehe ich nirgens ein &quot;non-type argument pack&quot;.</p>
<p>Ich hoffe diese Fehlerbeschreibung ist irgendwie verständlich, ansonsten bitte einfach nachfragen.</p>
<p>Grüße,<br />
PI</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302012/sorry-unimplemented-mangling-nontype_argument_pack</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 17:01:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302012.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 Apr 2012 13:40:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to sorry, unimplemented: mangling nontype_argument_pack on Mon, 09 Apr 2012 13:40:14 GMT]]></title><description><![CDATA[<p>Hallöle,</p>
<p>Sorry für den blöden Threadtitel, aber der Fehler ist so umfangreich, mir ist da nichts besseres eingefallen. Folgendes Szenario: Ich habe angefangen, Boost.Lambda nachzuprogrammieren, alle Operatoren sowie Platzhalter funktionieren bereits. Was mir Probleme bereitet, ist eine Art while Konstrukt.</p>
<p>Hier ein Beispiel, wie das ganze aussehen soll:</p>
<pre><code class="language-cpp">auto f = while_(_0)[--_0];
</code></pre>
<p>Diese Lambda nimmt also das erste Argument und dekrementiert es, bis es 0 ist.</p>
<p>Alle Ausdrücke werden vom CRTP Klassentemplate expression&lt;DerivedType&gt; abgeleitet. while_ ist eine Funktion, die einen solchen Ausdruck nimmt und eine while_expression&lt;CondType&gt; zurückgibt. Für while_expression ist der operator [] überladen, der eine while_body_expression&lt;CondType, BodyType&gt; zurückgibt.</p>
<p>while_body_expression sieht wie folgt aus:</p>
<pre><code class="language-cpp">template &lt;typename Cond, typename Body&gt;
struct while_body_expression : expression&lt;while_body_expression&lt;Cond, Body&gt;&gt;
{
	while_body_expression(Cond cond, Body body)
		: cond(cond), body(body)
	{}

	template &lt;typename... Args&gt;
	void operator () (Args&amp;&amp;... args) const
	{
		while(cond(std::forward&lt;Args&gt;(args)...))
			body(std::forward&lt;Args&gt;(args)...);
	}

private:
	Cond cond;
	Body body;
};
</code></pre>
<p>Wenn ich die oben gegebene Lambda mit dem folgenden Stück Code instanziere und verwende:</p>
<pre><code class="language-cpp">auto f = while_(_0)[--_0];
int i = 20;
f(i);
</code></pre>
<p>, sagt mir der Compiler:</p>
<pre><code class="language-cpp">In file included from ../main.cpp:3:0:
../lambda/arithmetic_ops.hpp: In instantiation of 'decltype (-- declval&lt;Expr&gt;()((forward&lt;Args&gt;)(lambda::prefix_decrement_expression::operator()::args)...)) lambda::prefix_decrement_expression&lt;Expr&gt;::operator()(Args&amp;&amp; ...) const [with Args = {int&amp;}; Expr = lambda::argument_placeholder_expression&lt;0u&gt;; decltype (-- declval&lt;Expr&gt;()((forward&lt;Args&gt;)(lambda::prefix_decrement_expression::operator()::args)...)) = int&amp;]':
../lambda/while.hpp:21:5:   required from 'void lambda::while_body_expression&lt;Cond, Body&gt;::operator()(Args&amp;&amp; ...) const [with Args = {int&amp;}; Cond = lambda::argument_placeholder_expression&lt;0u&gt;; Body = lambda::prefix_decrement_expression&lt;lambda::argument_placeholder_expression&lt;0u&gt; &gt;]'
../main.cpp:14:5:   required from here
../lambda/arithmetic_ops.hpp:22:2: sorry, unimplemented: mangling nontype_argument_pack
</code></pre>
<p>Wobei er in main.cpp auf die Zeile des Aufrufs verweist und in arithmetic_ops.hpp auf die Definition des operator --, die über folgende Makroinstanzierung</p>
<pre><code class="language-cpp">DEFINE_UNARY_EXPRESSION(prefix_decrement, --)
</code></pre>
<p>wie hier zu sehen aussieht:</p>
<pre><code class="language-cpp">#define DEFINE_UNARY_EXPRESSION_TYPE(name, op) \
	template &lt;typename Expr&gt; \
	struct name##_expression : expression&lt;name##_expression&lt;Expr&gt;&gt; \
	{ \
		name##_expression(Expr expr) \
			: expr(expr) \
		{} \
	\
		template &lt;typename... Args&gt; \
		auto operator () (Args&amp;&amp;... args) const \
			-&gt; decltype(op std::declval&lt;Expr&gt;()(std::forward&lt;Args&gt;(args)...)) \
		{ \
			return op expr(std::forward&lt;Args&gt;(args)...); \
		} \
	\
	private: \
		Expr expr; \
	};

#define DEFINE_UNARY_EXPRESSION(name, op) \
	DEFINE_UNARY_EXPRESSION_TYPE(name, op) \
	\
	template &lt;typename Derived&gt; \
	name##_expression&lt;Derived&gt; expression&lt;Derived&gt;::operator op () const \
	{ \
		return name##_expression&lt;Derived&gt;(derived_this()); \
	}
</code></pre>
<p>Dieses Makro definiert einen Typ prefix_decrement_expression und implementiert den in der Basisklasse expression&lt;&gt; deklarierten operator --.</p>
<p>Was mich wurmt, ist, dass die Operatoren alle ohne das while funktionieren. Erst wenn ich ein while in die Lambda einbaue kommen diese Fehler, völlig unabhängig davon, welche Operatoren ich nun in der Lambda verwende. Auch sehe ich nirgens ein &quot;non-type argument pack&quot;.</p>
<p>Ich hoffe diese Fehlerbeschreibung ist irgendwie verständlich, ansonsten bitte einfach nachfragen.</p>
<p>Grüße,<br />
PI</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2200175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200175</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 09 Apr 2012 13:40:14 GMT</pubDate></item><item><title><![CDATA[Reply to sorry, unimplemented: mangling nontype_argument_pack on Wed, 11 Apr 2012 08:28:39 GMT]]></title><description><![CDATA[<p>Hat denn niemand eine Idee? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2200676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200676</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 11 Apr 2012 08:28:39 GMT</pubDate></item><item><title><![CDATA[Reply to sorry, unimplemented: mangling nontype_argument_pack on Wed, 11 Apr 2012 10:54:31 GMT]]></title><description><![CDATA[<p><code>sorry, unimplemented: mangling nontype_argument_pack</code> ist normalerweise ein Hinweis darauf, dass der Compiler irgendetwas, dass unterstützt werden soll noch nicht kann.<br />
Mit Deinem Code ist vermutlich alles i.O., nur kann der Compiler das in diesem speziellen Kontext noch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2200723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200723</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 11 Apr 2012 10:54:31 GMT</pubDate></item><item><title><![CDATA[Reply to sorry, unimplemented: mangling nontype_argument_pack on Wed, 11 Apr 2012 10:57:32 GMT]]></title><description><![CDATA[<p>Ich weiß schon, dass der Hinweis das suggeriert. Aber ich hab doch nur argument packs mit Typen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2200728</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200728</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 11 Apr 2012 10:57:32 GMT</pubDate></item><item><title><![CDATA[Reply to sorry, unimplemented: mangling nontype_argument_pack on Wed, 11 Apr 2012 11:12:37 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Ich weiß schon, dass der Hinweis das suggeriert. Aber ich hab doch nur argument packs mit Typen.</p>
</blockquote>
<p>Ich bin mir nicht sicher, wo das hier: <code>lambda::argument_placeholder_expression&lt;0u&gt;; Body = lambda::prefix_decrement_expression&lt;lambda::argument_placeholder_expression&lt;0u&gt;</code> entsteht, aber da wird irgendwie ein Ganzahl-Argument eingesetzt. Ich tippe mal darauf, dass das Problem irgendwie darin liegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2200739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200739</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 11 Apr 2012 11:12:37 GMT</pubDate></item><item><title><![CDATA[Reply to sorry, unimplemented: mangling nontype_argument_pack on Wed, 11 Apr 2012 11:31:45 GMT]]></title><description><![CDATA[<p>Das ist der Placeholder, das Placeholder Template sieht so aus:</p>
<pre><code class="language-cpp">template &lt;unsigned N&gt;
struct argument_placeholder_expression : expression&lt;argument_placeholder_expression&lt;N&gt;&gt;
{
	template &lt;typename Head, typename... Tail&gt;
	auto operator () (Head&amp;&amp;, Tail&amp;&amp;... tail) const
		-&gt; decltype(argument_placeholder_expression&lt;N - 1&gt;()(std::forward&lt;Tail&gt;(tail)...))
	{
		return argument_placeholder_expression&lt;N - 1&gt;()(std::forward&lt;Tail&gt;(tail)...);
	}
};

template &lt;&gt;
struct argument_placeholder_expression&lt;0&gt; : expression&lt;argument_placeholder_expression&lt;0&gt;&gt;
{
	template &lt;typename Head, typename... Tail&gt;
	Head operator () (Head&amp;&amp; head, Tail const&amp;...) const
	{
		return head;
	}
};

argument_placeholder_expression&lt;0&gt; const _0;
argument_placeholder_expression&lt;1&gt; const _1;
argument_placeholder_expression&lt;2&gt; const _2;
argument_placeholder_expression&lt;3&gt; const _3;
argument_placeholder_expression&lt;4&gt; const _4;
argument_placeholder_expression&lt;5&gt; const _5;
argument_placeholder_expression&lt;6&gt; const _6;
argument_placeholder_expression&lt;7&gt; const _7;
argument_placeholder_expression&lt;8&gt; const _8;
argument_placeholder_expression&lt;9&gt; const _9;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2200749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200749</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 11 Apr 2012 11:31:45 GMT</pubDate></item><item><title><![CDATA[Reply to sorry, unimplemented: mangling nontype_argument_pack on Wed, 11 Apr 2012 11:47:24 GMT]]></title><description><![CDATA[<p>Ich habe jetzt mal versucht, das Placeholder-Template durch je einen eigenen Typen für jeden Placeholder zu ersetzen. Hat leider nichts geändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2200755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200755</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 11 Apr 2012 11:47:24 GMT</pubDate></item><item><title><![CDATA[Reply to sorry, unimplemented: mangling nontype_argument_pack on Wed, 11 Apr 2012 15:00:33 GMT]]></title><description><![CDATA[<p>Ich habe mal nach <strong>nontype_argument_pack</strong> gesucht, und bin dabei auf folgende Seite gestoßen: <a href="http://nesl.ee.ucla.edu/fw/han/old_machine_backup/overo-oe/tmp/work/armv7a-angstrom-linux-gnueabi/gcc-cross-4.3.3-r12.1/gcc-4.3.3/gcc/cp/cp-tree.def" rel="nofollow">Seite</a>.<br />
Dort wird etwas weiter unten beschrieben, was sich hinter einem nontype_argument_pack verbirgt, und anscheinend sind das neben ordinalen Konstanten auch Funktionsargumente. Vielleicht hängt es irgendwie mit dem Forwarding zusammen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2200830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200830</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 11 Apr 2012 15:00:33 GMT</pubDate></item><item><title><![CDATA[Reply to sorry, unimplemented: mangling nontype_argument_pack on Wed, 11 Apr 2012 16:50:43 GMT]]></title><description><![CDATA[<p>Okay, das wäre möglich, aber ich kanns mir irgendwie nicht vorstellen, bzw verstehe es auch nicht. Denn das while ruft die Expressions auch nicht anders auf, als es die Operatoren und Placeholder tun, und ohne funktioniert es ja offensichtlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2200871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200871</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 11 Apr 2012 16:50:43 GMT</pubDate></item><item><title><![CDATA[Reply to sorry, unimplemented: mangling nontype_argument_pack on Wed, 11 Apr 2012 17:02:11 GMT]]></title><description><![CDATA[<p>Schreib' doch vielleicht mal die Compilerbauer an. Vielleicht ist das ein Bug.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2200878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200878</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 11 Apr 2012 17:02:11 GMT</pubDate></item><item><title><![CDATA[Reply to sorry, unimplemented: mangling nontype_argument_pack on Fri, 13 Apr 2012 10:00:51 GMT]]></title><description><![CDATA[<p>War wohl wirklich irgendwas unimplementiert, auch wenn ich nicht weiß, was. Hab nun nen GCC 4.8 und es läuft. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201527</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 13 Apr 2012 10:00:51 GMT</pubDate></item></channel></rss>