<?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[[Gelöst]Compiler(GCC) findet Speialisierung von funktionstemplate nicht, wenn diese wiederum ein template part enthält]]></title><description><![CDATA[<p>Hi,</p>
<p>folgender code wird problemlos vom C++ Compiler von Visual Studio 2012 übersetzt.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;

class test
{
public:
    template &lt;typename T&gt;
    void print(T&amp; value);

    void printRaw(void* data)
    {
        std::cout&lt;&lt;&quot;data: &quot;&lt;&lt;data&lt;&lt;&quot;\n&quot;;
    }
};

namespace dummy
{
    template&lt;typename T&gt;
    void print(test&amp; tt, T&amp; value)
    {
        static_assert(sizeof(T) == 0, &quot;unimplemented&quot;);
    }
}

//namespace dummy
//{
//    template&lt;typename T&gt;
//    void print(test&amp; tt, std::vector&lt;T&gt;&amp; value)
//    {
//        size_t size = value.size();
//        tt.print(size);
//    }

//}

template &lt;typename T&gt;
void test::print(T&amp; value)
{
    dummy::print(*this, value);
}

namespace dummy
{
    template&lt;&gt;
    void print(test&amp; tt, int&amp; value)
    {
        tt.printRaw(&amp;value);
    }

    template&lt;&gt;
    void print(test&amp; tt, size_t&amp; value)
    {
        tt.printRaw(&amp;value);
    }

    template&lt;typename T&gt;
    void print(test&amp; tt, std::vector&lt;T&gt;&amp; value)
    {
        size_t size = value.size();
        tt.print(size);
    }
}

int main()
{
    test testInst;

    int t = 100;
    testInst.print(t);

    std::vector&lt;float&gt; ttt;
    testInst.print(ttt);

    return 0;
}
</code></pre>
<p>Nur dem gcc (4.6 und 4.8 getestet mit aktiver c++11 Unterstützung) lässt sich der code nicht übersetzen.<br />
Für den Aufruf</p>
<pre><code>testInst.print(std::vector&lt;T&gt;)
</code></pre>
<p>findet der gcc scheinbar nur das funktionstemplate</p>
<pre><code>template&lt;typename T&gt;
    void print(test&amp; tt, T&amp; value)
</code></pre>
<p>, welche aber nur dazu dient einen compiler Fehler zu generieren, wenn für einen bestimmten Typ keine Spezialisierung dieses templates existiert.</p>
<p>Wenn ich aber die zeilen 25-34 anstelle der zeilen 58 - 63 aktiviere, dann funktioniert das übersetzen auch mit dem GCC.</p>
<p>Nur das ist nicht gewollt. Denn dadurch müsste jede Spezialisierung bereits vor der Definierung von</p>
<pre><code>template &lt;typename T&gt;
void test::print(T&amp; value)
</code></pre>
<p>bekannt sein.</p>
<p>Gibt es eine Möglichkeit den code, so wie er oben steht, auch mit dem GCC zu übersetzen?<br />
Oder funktioniert das so eventuell überhaupt nicht laut c++ standard?</p>
<p>Eventuell müsste das funktionstemplate anders deklariert werden, damit auch Spezialisierungen gefunden werden, welche wiederum selbst einen template parameter definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326586/gelöst-compiler-gcc-findet-speialisierung-von-funktionstemplate-nicht-wenn-diese-wiederum-ein-template-part-enthält</link><generator>RSS for Node</generator><lastBuildDate>Sun, 24 May 2026 22:59:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326586.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Jun 2014 05:39:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Gelöst]Compiler(GCC) findet Speialisierung von funktionstemplate nicht, wenn diese wiederum ein template part enthält on Wed, 25 Jun 2014 09:34:03 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>folgender code wird problemlos vom C++ Compiler von Visual Studio 2012 übersetzt.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;

class test
{
public:
    template &lt;typename T&gt;
    void print(T&amp; value);

    void printRaw(void* data)
    {
        std::cout&lt;&lt;&quot;data: &quot;&lt;&lt;data&lt;&lt;&quot;\n&quot;;
    }
};

namespace dummy
{
    template&lt;typename T&gt;
    void print(test&amp; tt, T&amp; value)
    {
        static_assert(sizeof(T) == 0, &quot;unimplemented&quot;);
    }
}

//namespace dummy
//{
//    template&lt;typename T&gt;
//    void print(test&amp; tt, std::vector&lt;T&gt;&amp; value)
//    {
//        size_t size = value.size();
//        tt.print(size);
//    }

//}

template &lt;typename T&gt;
void test::print(T&amp; value)
{
    dummy::print(*this, value);
}

namespace dummy
{
    template&lt;&gt;
    void print(test&amp; tt, int&amp; value)
    {
        tt.printRaw(&amp;value);
    }

    template&lt;&gt;
    void print(test&amp; tt, size_t&amp; value)
    {
        tt.printRaw(&amp;value);
    }

    template&lt;typename T&gt;
    void print(test&amp; tt, std::vector&lt;T&gt;&amp; value)
    {
        size_t size = value.size();
        tt.print(size);
    }
}

int main()
{
    test testInst;

    int t = 100;
    testInst.print(t);

    std::vector&lt;float&gt; ttt;
    testInst.print(ttt);

    return 0;
}
</code></pre>
<p>Nur dem gcc (4.6 und 4.8 getestet mit aktiver c++11 Unterstützung) lässt sich der code nicht übersetzen.<br />
Für den Aufruf</p>
<pre><code>testInst.print(std::vector&lt;T&gt;)
</code></pre>
<p>findet der gcc scheinbar nur das funktionstemplate</p>
<pre><code>template&lt;typename T&gt;
    void print(test&amp; tt, T&amp; value)
</code></pre>
<p>, welche aber nur dazu dient einen compiler Fehler zu generieren, wenn für einen bestimmten Typ keine Spezialisierung dieses templates existiert.</p>
<p>Wenn ich aber die zeilen 25-34 anstelle der zeilen 58 - 63 aktiviere, dann funktioniert das übersetzen auch mit dem GCC.</p>
<p>Nur das ist nicht gewollt. Denn dadurch müsste jede Spezialisierung bereits vor der Definierung von</p>
<pre><code>template &lt;typename T&gt;
void test::print(T&amp; value)
</code></pre>
<p>bekannt sein.</p>
<p>Gibt es eine Möglichkeit den code, so wie er oben steht, auch mit dem GCC zu übersetzen?<br />
Oder funktioniert das so eventuell überhaupt nicht laut c++ standard?</p>
<p>Eventuell müsste das funktionstemplate anders deklariert werden, damit auch Spezialisierungen gefunden werden, welche wiederum selbst einen template parameter definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405492</guid><dc:creator><![CDATA[firefly]]></dc:creator><pubDate>Wed, 25 Jun 2014 09:34:03 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst]Compiler(GCC) findet Speialisierung von funktionstemplate nicht, wenn diese wiederum ein template part enthält on Wed, 25 Jun 2014 07:29:12 GMT]]></title><description><![CDATA[<p>firefly schrieb:</p>
<blockquote>
<p>Oder funktioniert das so eventuell überhaupt nicht laut c++ standard?</p>
</blockquote>
<p>Exakt.Nur Funktionen die in Zeile 41 bekannt sind, kommen für den lookup in Frage. Der VC erlaubt da mehr als der Standard erlaubt.</p>
<p>Im Zweifelsfall musst du Klassenspezialisierungen benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405497</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Wed, 25 Jun 2014 07:29:12 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst]Compiler(GCC) findet Speialisierung von funktionstemplate nicht, wenn diese wiederum ein template part enthält on Wed, 25 Jun 2014 08:14:44 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>firefly schrieb:</p>
<blockquote>
<p>Oder funktioniert das so eventuell überhaupt nicht laut c++ standard?</p>
</blockquote>
<p>Exakt.Nur Funktionen die in Zeile 41 bekannt sind, kommen für den lookup in Frage. Der VC erlaubt da mehr als der Standard erlaubt.</p>
<p>Im Zweifelsfall musst du Klassenspezialisierungen benutzen.</p>
</blockquote>
<p>Meinst du damit, dass für das klassentemplate &quot;test&quot; spezialisierungen gemacht werden müssten oder könnte man ein hier eine klassentemplate statt des funktionstemplates erstellen, welches dann spezialisiert werden kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405506</guid><dc:creator><![CDATA[firefly]]></dc:creator><pubDate>Wed, 25 Jun 2014 08:14:44 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst]Compiler(GCC) findet Speialisierung von funktionstemplate nicht, wenn diese wiederum ein template part enthält on Wed, 25 Jun 2014 09:00:19 GMT]]></title><description><![CDATA[<p>Ok habe ne lösung gefunden, welche im grunde das gleiche design beibehält:</p>
<p>statt des funktions templates verwende ich nun ein funktions objekt template</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;

class test
{
public:
    template &lt;typename T&gt;
    void print(T&amp; value);

    void printRaw(void* data)
    {
        std::cout&lt;&lt;&quot;data: &quot;&lt;&lt;data&lt;&lt;&quot;\n&quot;;
    }
};

namespace dummy
{
    template&lt;typename T&gt;
    struct printer
    {
        static_assert(sizeof(T) == 0, &quot;unimplemented&quot;);

        void operator()(test&amp; tt, T&amp; value)
        {

        }
    };
}

template &lt;typename T&gt;
void test::print(T&amp; value)
{
    dummy::printer&lt;T&gt;()(*this, value);
}

namespace dummy
{
    template&lt;&gt;
    struct printer&lt;int&gt;
    {
    public:
        void operator()(test&amp; tt, int&amp; value)
        {
            std::cout&lt;&lt;&quot;int printer ()\n&quot;;
        }
    };

    template&lt;&gt;
    struct printer&lt;size_t&gt;
    {
    public:
        void operator()(test&amp; tt, size_t&amp; value)
        {
            std::cout&lt;&lt;&quot;size_t printer ()\n&quot;;
        }
    };

    template&lt;typename T&gt;
    struct printer&lt; std::vector&lt;T&gt; &gt;
    {
        void operator()(test&amp; tt, std::vector&lt;T&gt;&amp; value)
        {
            std::cout&lt;&lt;&quot;vector&lt;T&gt; printer ()\n&quot;;
            size_t size = value.size();
            tt.print(size);
        }
    };
}

int main()
{
    test testInst;

    int t = 100;
    testInst.print(t);

    std::vector&lt;float&gt; ttt;
    testInst.print(ttt);

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2405519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405519</guid><dc:creator><![CDATA[firefly]]></dc:creator><pubDate>Wed, 25 Jun 2014 09:00:19 GMT</pubDate></item></channel></rss>