<?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-Problem (deduction&#x2F;substitution failed)]]></title><description><![CDATA[<p>Ich hab ein Funktionstemplate namens memory, das für unterschiedliche Klassen unterschiedlich implementiert werden soll. Allerdings kommt der im Titel erwähnte Fehler:</p>
<pre><code>template &lt;class DataContainer, class T, class Weight, class Coreset, class Threshold&gt;
size_t memory(const typename RangeClustering::OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;::OneDNode&amp; node) {
    return sizeof(node);
}

template &lt;class DataContainer, class T, class Weight, class Coreset, class Threshold&gt;
size_t RangeClustering::OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;::memoryUsage() const {
    return memory(nodeContainer[0]); // nodeContainer[0] ist vom Typ const ...::OneDNode&amp;
//                                ^
//                    hier ist der Fehler
}
</code></pre>
<p>Entscheidende Fehlermeldung ist:</p>
<blockquote>
<p>../RangeClustering/RangeClustering/../RangeClustering/OneDTree.h:170:35: note: couldn't deduce template parameter 'DataContainer'</p>
</blockquote>
<p>Ich vermute, dass das Problem ist, dass die Unterklasse OneDNode von einigen Template-Parametern nicht mehr explizit abhängt.</p>
<p>Hier die Attribute der Unterklasse:</p>
<pre><code>class OneDNode {
    private:
        OneDNode* left;
        OneDNode* right;
        T median;
        Weight representedPoints;
    };
</code></pre>
<p>Wie löse ich den Fehler am elegantesten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326843/template-problem-deduction-substitution-failed</link><generator>RSS for Node</generator><lastBuildDate>Sun, 24 May 2026 22:59:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326843.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 09 Jul 2014 21:04:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template-Problem (deduction&#x2F;substitution failed) on Wed, 09 Jul 2014 21:04:54 GMT]]></title><description><![CDATA[<p>Ich hab ein Funktionstemplate namens memory, das für unterschiedliche Klassen unterschiedlich implementiert werden soll. Allerdings kommt der im Titel erwähnte Fehler:</p>
<pre><code>template &lt;class DataContainer, class T, class Weight, class Coreset, class Threshold&gt;
size_t memory(const typename RangeClustering::OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;::OneDNode&amp; node) {
    return sizeof(node);
}

template &lt;class DataContainer, class T, class Weight, class Coreset, class Threshold&gt;
size_t RangeClustering::OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;::memoryUsage() const {
    return memory(nodeContainer[0]); // nodeContainer[0] ist vom Typ const ...::OneDNode&amp;
//                                ^
//                    hier ist der Fehler
}
</code></pre>
<p>Entscheidende Fehlermeldung ist:</p>
<blockquote>
<p>../RangeClustering/RangeClustering/../RangeClustering/OneDTree.h:170:35: note: couldn't deduce template parameter 'DataContainer'</p>
</blockquote>
<p>Ich vermute, dass das Problem ist, dass die Unterklasse OneDNode von einigen Template-Parametern nicht mehr explizit abhängt.</p>
<p>Hier die Attribute der Unterklasse:</p>
<pre><code>class OneDNode {
    private:
        OneDNode* left;
        OneDNode* right;
        T median;
        Weight representedPoints;
    };
</code></pre>
<p>Wie löse ich den Fehler am elegantesten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407871</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Wed, 09 Jul 2014 21:04:54 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Problem (deduction&#x2F;substitution failed) on Wed, 09 Jul 2014 21:20:06 GMT]]></title><description><![CDATA[<p>Ist dir</p>
<pre><code class="language-cpp">return memory&lt;DataContainer, T, Weight, Coreset, Treshold&gt;(nodeContainer[0]);
</code></pre>
<p>schon zu unelegant?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407876</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Wed, 09 Jul 2014 21:20:06 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Problem (deduction&#x2F;substitution failed) on Wed, 09 Jul 2014 21:38:38 GMT]]></title><description><![CDATA[<p>Das wäre ok, geht bei mir so aber leider nicht. Das konntest du aber nicht wissen, da ich meinen Code zu weit zusammengestutzt hab...</p>
<p>In Wirklichkeit sieht es so aus:</p>
<pre><code>template &lt;class U&gt;
size_t memory(const std::deque&lt;U&gt;&amp; obj) {
    size_t sum = sizeof(obj);
    for (const U&amp; u: obj) {
        sum += memory(u); // hier failt die template deduction
    }
    return sum;
}

template &lt;class DataContainer, class T, class Weight, class Coreset, class Threshold&gt;
size_t RangeClustering::OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;::memoryUsage() const {
    return memory(nodeContainer); // nodeContainer ist vom Typ std::deque&lt;OneDNode&gt;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2407879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407879</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Wed, 09 Jul 2014 21:38:38 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Problem (deduction&#x2F;substitution failed) on Wed, 09 Jul 2014 21:51:28 GMT]]></title><description><![CDATA[<p>Hm, bekomme ich nicht reproduziert. Mach mal ein kompilierbares Minimalbeispiel mit dem gleichen Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407882</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Wed, 09 Jul 2014 21:51:28 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Problem (deduction&#x2F;substitution failed) on Thu, 10 Jul 2014 07:56:50 GMT]]></title><description><![CDATA[<p>Das Problem hat einen anderen Grund:<br />
Template-Typen können sich nicht aus nested-types deduzieren lassen. Das wäre hier der Fall:</p>
<pre><code>template &lt;class DataContainer, class T, class Weight, class Coreset, class Threshold&gt; 
size_t memory(const typename RangeClustering::OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;::OneDNode&amp; node) { 
    return sizeof(node); 
}
</code></pre>
<p>Also der Compiler kennt ja den Typen, den du an die Funktion übergibst, hier mal <code>U</code> . Aber wie soll er <code>DataContainer, T, Weight, Coreset, Threshold</code> dadurch deduzieren? Das Template für alle existenten Typen instanziieren und schauen, ob dann <code>OneDNode</code>  <code>U</code> entspricht (das dürfte kaum in absehbarer Zeit möglich sein)? Und wenn es mehrere Instanziierungen gibt (was sehr wahrscheinlich der Fall ist), schlägt die Deduzierung ohnehin fehl. Aufrufe von <code>memory</code> werden also nie klappen wenn du die Argumente nicht explizit vorgibst.</p>
<p>Edit:<br />
Äquivalentes Minimalbeispiel:</p>
<pre><code>template&lt;typename T&gt;
struct Foo
{
	typedef T Type;
};

template&lt;typename T&gt;
void Bar(typename Foo&lt;T&gt;::Type)
{
}

int main()
{
	Bar(5);
}
</code></pre>
<p>Für uns Menschen ist es natürlich offensichtlich, dass hier <code>T</code> als <code>int</code> deduziert werden sollte, das geht leider selbst bei so einem einfachen Beispiel nicht. Bzw. zum Glück! Alles andere wäre schlecht da es in komplizierteren Fällen nicht funktionieren wird.</p>
<p>Edit 2:<br />
Wenn in derselben Instanziierung die Template-Argumente anderweitig deduziert werden können, ist es natürlich kein Problem dass man sie nicht explizit angibt:</p>
<pre><code>template &lt;class ForwardIterator&gt;
ForwardIterator next(ForwardIterator it, typename iterator_traits&lt;ForwardIterator&gt;::difference_type n = 1);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2407920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407920</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Thu, 10 Jul 2014 07:56:50 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Problem (deduction&#x2F;substitution failed) on Thu, 10 Jul 2014 15:05:56 GMT]]></title><description><![CDATA[<p>ok, damit weiß ich jetzt auf jeden Fall, woran der Fehler liegt.</p>
<p>Wie würdet ihr das Problem am Besten umgehen? Die Unterklasse als eigenständgie Klasse implementieren? Oder die Implementierung von memory(OneDTree) so gestalten, dass keine weiteren Funktionen mehr aufgerufen werden? Letzteres würde natürlich zur Code-Dublizierung führen, was nicht so schön ist. Oder gibt es noch eine bessere Alternative?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408023</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Thu, 10 Jul 2014 15:05:56 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Problem (deduction&#x2F;substitution failed) on Thu, 10 Jul 2014 15:31:27 GMT]]></title><description><![CDATA[<p>Ramanujan schrieb:</p>
<blockquote>
<p>ok, damit weiß ich jetzt auf jeden Fall, woran der Fehler liegt.</p>
<p>Wie würdet ihr das Problem am Besten umgehen? Die Unterklasse als eigenständgie Klasse implementieren? Oder die Implementierung von memory(OneDTree) so gestalten, dass keine weiteren Funktionen mehr aufgerufen werden? Letzteres würde natürlich zur Code-Dublizierung führen, was nicht so schön ist. Oder gibt es noch eine bessere Alternative?</p>
</blockquote>
<p>Der Compiler kennt den Zusammenhang zwischen OneDNode und OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt; nicht, du dagegen schon. Also kann man nat. nachhelfen. Z.B. dadurch, dass OneDNode ein sein OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt; kennt.<br />
Ich unterstelle mal, dass OneDNode ein typedef names tree_type auf sein OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt; hat.<br />
Dann würde z.B. funktionieren</p>
<pre><code class="language-cpp">template &lt;typename T&gt; struct isOneDTree : std::false_type {};
template &lt;class DataContainer, class T, class Weight, class Coreset, class Threshold&gt;
struct isOneDTree&lt;RangeClustering::OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt; : std::true_type {};

template &lt;typename Node&gt;
typename std::enable_if&lt;isOneDtree&lt;typename Node::tree_type, size_t&gt;::type memory(const Node&amp; node) {
    return sizeof(node);
}
</code></pre>
<p>Es gibt verschiedene Möglichkeiten, das zu schreiben; die Grundidee ist, anstatt den Funktionsparameter strukturell einzuschränken, diesen sehr allgemein zu halten (const T&amp; frisst ja alles), und dann aber darauf ein geeignetes Prädikat anzuwenden, das die möglichen Typen einschränkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408034</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 10 Jul 2014 15:31:27 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Problem (deduction&#x2F;substitution failed) on Fri, 11 Jul 2014 19:05:35 GMT]]></title><description><![CDATA[<p>Eine interessante Lösung, allerdings empfinde ich die als recht umständlich. Ich hab es nun doch so gelöst, dass ich die innere Klasse zu einer eigenen Klasse gemacht hab. Allerdings kompiliert es immer noch nicht: Er kann das Template scheinbar nicht finden.</p>
<p>Hier der Fehler-Log:</p>
<blockquote>
<p>In file included from ../RangeClustering/RangeClustering/../Container/ExternalArray.h:10:0,<br />
from ../RangeClustering/RangeClustering/Test_RangeClustering.cpp:9:<br />
../RangeClustering/RangeClustering/../Container/../Memory.h: In instantiation of 'size_t memory(const std::deque&lt;U&gt;&amp;) [with U = RangeClustering::OneDNode&lt;float, unsigned int, std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;, double&gt;; size_t = unsigned int]':<br />
../RangeClustering/RangeClustering/../RangeClustering/OneDTree.h:171:32: required from 'size_t RangeClustering::OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;::memoryUsage() const [with DataContainer = std::vector&lt;float&gt;; T = float; Weight = unsigned int; Coreset = std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;; Threshold = double; size_t = unsigned int]'<br />
../RangeClustering/RangeClustering/Test_RangeClustering.cpp:359:1: required from here<br />
../RangeClustering/RangeClustering/../Container/../Memory.h:47:24: error: no matching function for call to 'memory(const RangeClustering::OneDNode&lt;float, unsigned int, std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;, double&gt;&amp;)'<br />
sum += memory(u);<br />
^<br />
../RangeClustering/RangeClustering/../Container/../Memory.h:47:24: note: candidates are:<br />
../RangeClustering/RangeClustering/../Container/../Memory.h:10:70: note: template&lt;class T&gt; typename std::enable_if&lt;std::is_fundamental&lt;_Tp&gt;::value, unsigned int&gt;::type memory(const T&amp;)<br />
typename std::enable_if&lt;std::is_fundamental&lt;T&gt;::value, size_t&gt;::type memory(const T&amp; obj) {<br />
^<br />
../RangeClustering/RangeClustering/../Container/../Memory.h:10:70: note: template argument deduction/substitution failed:<br />
../RangeClustering/RangeClustering/../Container/../Memory.h: In substitution of 'template&lt;class T&gt; typename std::enable_if&lt;std::is_fundamental&lt;_Tp&gt;::value, unsigned int&gt;::type memory(const T&amp;) [with T = RangeClustering::OneDNode&lt;float, unsigned int, std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;, double&gt;]':<br />
../RangeClustering/RangeClustering/../Container/../Memory.h:47:24: required from 'size_t memory(const std::deque&lt;U&gt;&amp;) [with U = RangeClustering::OneDNode&lt;float, unsigned int, std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;, double&gt;; size_t = unsigned int]'<br />
../RangeClustering/RangeClustering/../RangeClustering/OneDTree.h:171:32: required from 'size_t RangeClustering::OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;::memoryUsage() const [with DataContainer = std::vector&lt;float&gt;; T = float; Weight = unsigned int; Coreset = std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;; Threshold = double; size_t = unsigned int]'<br />
../RangeClustering/RangeClustering/Test_RangeClustering.cpp:359:1: required from here<br />
../RangeClustering/RangeClustering/../Container/../Memory.h:10:70: error: no type named 'type' in 'struct std::enable_if&lt;false, unsigned int&gt;'<br />
../RangeClustering/RangeClustering/../Container/../Memory.h: In instantiation of 'size_t memory(const std::deque&lt;U&gt;&amp;) [with U = RangeClustering::OneDNode&lt;float, unsigned int, std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;, double&gt;; size_t = unsigned int]':<br />
../RangeClustering/RangeClustering/../RangeClustering/OneDTree.h:171:32: required from 'size_t RangeClustering::OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;::memoryUsage() const [with DataContainer = std::vector&lt;float&gt;; T = float; Weight = unsigned int; Coreset = std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;; Threshold = double; size_t = unsigned int]'<br />
../RangeClustering/RangeClustering/Test_RangeClustering.cpp:359:1: required from here<br />
../RangeClustering/RangeClustering/../Container/../Memory.h:35:8: note: template&lt;class U&gt; size_t memory(const std::vector&lt;_RealType&gt;&amp;)<br />
size_t memory(const std::vector&lt;U&gt;&amp; obj) {<br />
^<br />
../RangeClustering/RangeClustering/../Container/../Memory.h:35:8: note: template argument deduction/substitution failed:<br />
../RangeClustering/RangeClustering/../Container/../Memory.h:47:24: note: 'const RangeClustering::OneDNode&lt;float, unsigned int, std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;, double&gt;' is not derived from 'const std::vector&lt;_RealType&gt;'<br />
sum += memory(u);<br />
^<br />
../RangeClustering/RangeClustering/../Container/../Memory.h:44:8: note: template&lt;class U&gt; size_t memory(const std::deque&lt;U&gt;&amp;)<br />
size_t memory(const std::deque&lt;U&gt;&amp; obj) {<br />
^<br />
../RangeClustering/RangeClustering/../Container/../Memory.h:44:8: note: template argument deduction/substitution failed:<br />
../RangeClustering/RangeClustering/../Container/../Memory.h:47:24: note: 'const RangeClustering::OneDNode&lt;float, unsigned int, std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;, double&gt;' is not derived from 'const std::deque&lt;U&gt;'<br />
sum += memory(u);</p>
</blockquote>
<p>In der &quot;Memory.h&quot; steht die Deklaration und Definition der beiden folgenden Funktionstemplates:</p>
<pre><code>template &lt;class T&gt;
typename std::enable_if&lt;std::is_fundamental&lt;T&gt;::value, size_t&gt;::type memory(const T&amp; obj) {
    return sizeof(obj);
}

template &lt;class U&gt;
size_t memory(const std::deque&lt;U&gt;&amp; obj) {
    size_t sum = sizeof(obj);
    for (const U&amp; u: obj) {
        sum += memory(u);
    }
    return sum;
}
</code></pre>
<p>Im Fehlerlog des Compilers sieht man, dass offensichtlich nur die Funktionstemplates in der &quot;Memory.h&quot; durchprobiert werden</p>
<p>In der OneDTree.h steht:</p>
<pre><code>template &lt;class DataContainer, class T, class Weight, class Coreset, class Threshold&gt;
size_t memory(const RangeClustering::OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;&amp; tree) {
    return tree.memoryUsage();
}

template &lt;class T, class Weight, class Coreset, class Threshold&gt;
size_t memory(const RangeClustering::OneDNode&lt;T, Weight, Coreset, Threshold&gt;&amp; node) {
    return sizeof(node);
}

template &lt;class DataContainer, class T, class Weight, class Coreset, class Threshold&gt;
size_t RangeClustering::OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;::memoryUsage() const {
    return memory(nodeContainer) + sizeof(void*) + sizeof(threshold) + sizeof(root);
}
</code></pre>
<p>nodeContainer ist vom Typ std::deque&lt;OneDNode&lt;...&gt;&gt;</p>
<p>Kann mir jemand erklären, warum der Compiler das Funktionstemplate in der &quot;OneDTree.h&quot; nicht findet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408250</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Fri, 11 Jul 2014 19:05:35 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Problem (deduction&#x2F;substitution failed) on Fri, 11 Jul 2014 19:20:14 GMT]]></title><description><![CDATA[<p>Ist RangeClustering ein Namensraum oder eine Klasse? Falls es ein Namensraum ist, müssen auch die memory-Funktionen in diesem Namensraum liegen, da sie nur per ADL gefunden werden können, und bei diesen Templateparametern std der einzige andere Namensraum ist, der durchsucht wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408252</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 11 Jul 2014 19:20:14 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Problem (deduction&#x2F;substitution failed) on Fri, 11 Jul 2014 19:31:57 GMT]]></title><description><![CDATA[<p>Ja, RangeClustering ist ein Namensraum.</p>
<p>Ich hab es jetzt angepasst, aber es kompiliert immer noch nicht:</p>
<p>OneDTree.h:</p>
<pre><code>namespace RangeClustering {

template &lt;class DataContainer, class T, class Weight, class Coreset, class Threshold&gt;
size_t memory(const OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;&amp; tree) {
    return tree.memoryUsage();
}

template &lt;class T, class Weight, class Coreset, class Threshold&gt;
size_t memory(const OneDNode&lt;T, Weight, Coreset, Threshold&gt;&amp; node) {
    return sizeof(node);
}

} // namespace

template &lt;class DataContainer, class T, class Weight, class Coreset, class Threshold&gt;
size_t RangeClustering::OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;::memoryUsage() const {
    return memory(nodeContainer) + sizeof(void*) + sizeof(threshold) + sizeof(root); // &lt;---- Der Fehler ist hier
}
</code></pre>
<p>Jetzt findet er memory(std::deque&lt;U&gt;) nicht mehr. Die Funktion memory(std::deque&lt;U&gt;) liegt allerdings nicht im Namespace RangeClustering. Ist das das Problem?</p>
<p>Fehlermeldung:</p>
<blockquote>
<p>In file included from ../RangeClustering/RangeClustering/Test_RangeClustering.cpp:15:0:<br />
../RangeClustering/RangeClustering/../RangeClustering/OneDTree.h: In instantiation of 'size_t RangeClustering::OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;::memoryUsage() const [with DataContainer = std::vector&lt;float&gt;; T = float; Weight = unsigned int; Coreset = std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;; Threshold = double; size_t = unsigned int]':<br />
../RangeClustering/RangeClustering/Test_RangeClustering.cpp:359:1: required from here<br />
../RangeClustering/RangeClustering/../RangeClustering/OneDTree.h:173:32: error: no matching function for call to 'memory(const std::deque&lt;RangeClustering::OneDNode&lt;float, unsigned int, std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;, double&gt;, std::allocator&lt;RangeClustering::OneDNode&lt;float, unsigned int, std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;, double&gt; &gt; &gt;&amp;)'<br />
return memory(nodeContainer) + sizeof(void*) + sizeof(threshold) + sizeof(root);<br />
^<br />
../RangeClustering/RangeClustering/../RangeClustering/OneDTree.h:173:32: note: candidates are:<br />
../RangeClustering/RangeClustering/../RangeClustering/OneDTree.h:157:8: note: template&lt;class DataContainer, class T, class Weight, class Coreset, class Threshold&gt; size_t RangeClustering::memory(const RangeClustering::OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;&amp;)<br />
size_t memory(const OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;&amp; tree) {<br />
^<br />
../RangeClustering/RangeClustering/../RangeClustering/OneDTree.h:157:8: note: template argument deduction/substitution failed:<br />
../RangeClustering/RangeClustering/../RangeClustering/OneDTree.h:173:32: note: 'const std::deque&lt;RangeClustering::OneDNode&lt;float, unsigned int, std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;, double&gt;, std::allocator&lt;RangeClustering::OneDNode&lt;float, unsigned int, std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;, double&gt; &gt; &gt;' is not derived from 'const RangeClustering::OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;'<br />
return memory(nodeContainer) + sizeof(void*) + sizeof(threshold) + sizeof(root);<br />
^<br />
../RangeClustering/RangeClustering/../RangeClustering/OneDTree.h:162:8: note: template&lt;class T, class Weight, class Coreset, class Threshold&gt; size_t RangeClustering::memory(const RangeClustering::OneDNode&lt;T, Weight, Coreset, Threshold&gt;&amp;)<br />
size_t memory(const OneDNode&lt;T, Weight, Coreset, Threshold&gt;&amp; node) {<br />
^<br />
../RangeClustering/RangeClustering/../RangeClustering/OneDTree.h:162:8: note: template argument deduction/substitution failed:<br />
../RangeClustering/RangeClustering/../RangeClustering/OneDTree.h:173:32: note: 'const std::deque&lt;RangeClustering::OneDNode&lt;float, unsigned int, std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;, double&gt;, std::allocator&lt;RangeClustering::OneDNode&lt;float, unsigned int, std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;, double&gt; &gt; &gt;' is not derived from 'const RangeClustering::OneDNode&lt;T, Weight, Coreset, Threshold&gt;'<br />
return memory(nodeContainer) + sizeof(void*) + sizeof(threshold) + sizeof(root);<br />
^<br />
../RangeClustering/RangeClustering/../RangeClustering/OneDTree.h: In member function 'size_t RangeClustering::OneDTree&lt;DataContainer, T, Weight, Coreset, Threshold&gt;::memoryUsage() const [with DataContainer = std::vector&lt;float&gt;; T = float; Weight = unsigned int; Coreset = std::vector&lt;std::pair&lt;float, unsigned int&gt;, std::allocator&lt;std::pair&lt;float, unsigned int&gt; &gt; &gt;; Threshold = double; size_t = unsigned int]':<br />
../RangeClustering/RangeClustering/../RangeClustering/OneDTree.h:174:1: warning: control reaches end of non-void function [-Wreturn-type]<br />
}<br />
^</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2408256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408256</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Fri, 11 Jul 2014 19:31:57 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Problem (deduction&#x2F;substitution failed) on Fri, 11 Jul 2014 19:40:37 GMT]]></title><description><![CDATA[<p>Ramanujan schrieb:</p>
<blockquote>
<p>Jetzt findet er memory(std::deque&lt;U&gt;) nicht mehr. Die Funktion memory(std::deque&lt;U&gt;) liegt allerdings nicht im Namespace RangeClustering. Ist das das Problem?</p>
</blockquote>
<p>Durch die anderen memory-Deklarationen in RangeClustering wird das deque-memeroy (ich nehme an, das liegt im globalen Namensraum) verdeckt. Und solange U nicht mit dem globalen Namensraum assoziiert ist, kann diese memrory-Überladung folglich nicht (aus RangeClustering::OneDTree&lt;...&gt;::memoryUsage heraus) gefunden werden. Einfache Abhilfe wäre ein qualifizierter Aufruf oder eine entsprechende using-Deklaration in der Funktion oder in RangeClustering.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408258</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 11 Jul 2014 19:40:37 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Problem (deduction&#x2F;substitution failed) on Fri, 11 Jul 2014 21:06:14 GMT]]></title><description><![CDATA[<p>ok, danke, ich habs hinbekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408267</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Fri, 11 Jul 2014 21:06:14 GMT</pubDate></item></channel></rss>