<?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[Problem mit Template: &amp;lt;unresolved overloaded function type&amp;gt;]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich versuche gerade das Intercepting Filters Pattern (siehe <a href="http://www.nullskull.com/articles/20060609.asp" rel="nofollow">http://www.nullskull.com/articles/20060609.asp</a>) für C++ nachzuimplementieren.<br />
Das Pattern nutzt Templates um Daten jeglichen Typs verarbeiten zu können.</p>
<p>Ein zentrales Element in diesem Pattern ist das Instanzieren von Klassen via Strings. Da das in C++ nicht so einfach klappt wie in C# habe ich folgende Lösung von hier (<a href="http://stackoverflow.com/questions/582331/is-there-a-way-to-instantiate-objects-from-a-string-holding-their-class-name" rel="nofollow">http://stackoverflow.com/questions/582331/is-there-a-way-to-instantiate-objects-from-a-string-holding-their-class-name</a>) versucht nzu nutzen und in das Pattern zu integrieren.</p>
<p>Allerdings laufe ich jetzt auf Grund meiner geringen Programmiererfahrung mit Templates in ein Problem. Zunächst mal der relevante SourceCode:</p>
<pre><code>//File: abstractfilter.hpp
#ifndef ABSTRACTFILTER_H
#define ABSTRACTFILTER_H

#include &lt;boost/unordered_map.hpp&gt;
#include &lt;boost/foreach.hpp&gt;

#include &quot;ifilter.h&quot;

namespace ccns
{
    namespace util
    {
        template&lt;typename TF&gt;
        class AbstractFilter : public IFilter&lt;TF&gt;
        {
        public:
            template&lt;typename T&gt; IFilter&lt;TF&gt;* createTemplate() {return new T;}

            struct FilterFactory
            {
                typedef boost::unordered_map&lt;std::string, IFilter&lt;TF&gt;*(*)()&gt; FilterMap;

                static IFilter&lt;TF&gt;* createFilterInstance(const std::string &amp;name)
                {
                    BOOST_FOREACH(FilterMap entry, getMap())
                        {
                            if(name.compare(entry.first) == 0)
                                return entry.second;
                        }
                    return NULL;
                }

            protected:
                static FilterMap* getMap()
                {
                    if(filters != NULL)
                        filters = new FilterMap;
                    return filters;
                }

            private:
                static FilterMap *filters;
            };

            template&lt;typename T&gt;
            struct FilterRegister : FilterFactory
            {
                FilterRegister(const std::string&amp; name)
                {
                    FilterFactory::getMap()-&gt;insert(typename FilterFactory::FilterMap::value_type(name, &amp;createTemplate&lt;T&gt;));
                }
            };

            virtual bool process(TF){return true;}

        protected:
        };
    }
}

#endif // ABSTRACTFILTER_H
</code></pre>
<p>In dieser Zeile:</p>
<pre><code>FilterFactory::getMap()-&gt;insert(typename FilterFactory::FilterMap::value_type(name, &amp;createTemplate&lt;T&gt;));
</code></pre>
<p>tritt nun folgender Compile-Error auf:</p>
<blockquote>
<p>In file included from samplefilter.h:6:0,<br />
from <a href="http://samplefilter.cc:1" rel="nofollow">samplefilter.cc:1</a>:<br />
abstractfilter.hpp: In constructor ‘ccns::util::AbstractFilter&lt;TF&gt;::FilterRegister&lt;T&gt;::FilterRegister(const string&amp;) [with T = ccns::util::SampleFilter, TF = std::basic_string&lt;char&gt;, std::string = std::basic_string&lt;char&gt;]’:<br />
samplefilter.cc:5:125: instantiated from here<br />
abstractfilter.hpp:53:21: error: no matching function for call to ‘std::pair&lt;const std::basic_string&lt;char&gt;, ccns::util::IFilter&lt;std::basic_string&lt;char&gt; &gt;* (<em>)()&gt;::pair(const string&amp;, &lt;unresolved overloaded function type&gt;)’<br />
abstractfilter.hpp:53:21: note: candidates are:<br />
/usr/include/c++/4.6/bits/stl_pair.h:108:21: note: template&lt;class _U1, class _U2&gt; std::pair::pair(const std::pair&lt;_U1, _U2&gt;&amp;)<br />
/usr/include/c++/4.6/bits/stl_pair.h:103:26: note: std::pair&lt;_T1, _T2&gt;::pair(const _T1&amp;, const _T2&amp;) [with _T1 = const std::basic_string&lt;char&gt;, _T2 = ccns::util::IFilter&lt;std::basic_string&lt;char&gt; &gt;</em> (<em>)()]<br />
/usr/include/c++/4.6/bits/stl_pair.h:103:26: note: no known conversion for argument 2 from ‘&lt;unresolved overloaded function type&gt;’ to ‘ccns::util::IFilter&lt;std::basic_string&lt;char&gt; &gt;</em> (* const&amp;)()’<br />
/usr/include/c++/4.6/bits/stl_pair.h:99:26: note: std::pair&lt;_T1, _T2&gt;::pair() [with _T1 = const std::basic_string&lt;char&gt;, _T2 = ccns::util::IFilter&lt;std::basic_string&lt;char&gt; &gt;* (<em>)()]<br />
/usr/include/c++/4.6/bits/stl_pair.h:99:26: note: candidate expects 0 arguments, 2 provided<br />
/usr/include/c++/4.6/bits/stl_pair.h:87:12: note: std::pair&lt;const std::basic_string&lt;char&gt;, ccns::util::IFilter&lt;std::basic_string&lt;char&gt; &gt;</em> (<em>)()&gt;::pair(const std::pair&lt;const std::basic_string&lt;char&gt;, ccns::util::IFilter&lt;std::basic_string&lt;char&gt; &gt;</em> (*)()&gt;&amp;)<br />
/usr/include/c++/4.6/bits/stl_pair.h:87:12: note: candidate expects 1 argument, 2 provided</p>
</blockquote>
<p>Soweit ich die Fehlermeldung verstehe ist der Typ von &amp;createTemplate&lt;T&gt; den Compiler unbekannt.</p>
<p>Meine Fragen dazu:</p>
<p>1. Wieso ist das so?<br />
2. Wie kann ich das Problem lösen?</p>
<p>LG<br />
Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/318602/problem-mit-template-lt-unresolved-overloaded-function-type-gt</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Jul 2026 05:37:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/318602.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 19 Jul 2013 09:08:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Template: &amp;lt;unresolved overloaded function type&amp;gt; on Fri, 19 Jul 2013 09:08:10 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich versuche gerade das Intercepting Filters Pattern (siehe <a href="http://www.nullskull.com/articles/20060609.asp" rel="nofollow">http://www.nullskull.com/articles/20060609.asp</a>) für C++ nachzuimplementieren.<br />
Das Pattern nutzt Templates um Daten jeglichen Typs verarbeiten zu können.</p>
<p>Ein zentrales Element in diesem Pattern ist das Instanzieren von Klassen via Strings. Da das in C++ nicht so einfach klappt wie in C# habe ich folgende Lösung von hier (<a href="http://stackoverflow.com/questions/582331/is-there-a-way-to-instantiate-objects-from-a-string-holding-their-class-name" rel="nofollow">http://stackoverflow.com/questions/582331/is-there-a-way-to-instantiate-objects-from-a-string-holding-their-class-name</a>) versucht nzu nutzen und in das Pattern zu integrieren.</p>
<p>Allerdings laufe ich jetzt auf Grund meiner geringen Programmiererfahrung mit Templates in ein Problem. Zunächst mal der relevante SourceCode:</p>
<pre><code>//File: abstractfilter.hpp
#ifndef ABSTRACTFILTER_H
#define ABSTRACTFILTER_H

#include &lt;boost/unordered_map.hpp&gt;
#include &lt;boost/foreach.hpp&gt;

#include &quot;ifilter.h&quot;

namespace ccns
{
    namespace util
    {
        template&lt;typename TF&gt;
        class AbstractFilter : public IFilter&lt;TF&gt;
        {
        public:
            template&lt;typename T&gt; IFilter&lt;TF&gt;* createTemplate() {return new T;}

            struct FilterFactory
            {
                typedef boost::unordered_map&lt;std::string, IFilter&lt;TF&gt;*(*)()&gt; FilterMap;

                static IFilter&lt;TF&gt;* createFilterInstance(const std::string &amp;name)
                {
                    BOOST_FOREACH(FilterMap entry, getMap())
                        {
                            if(name.compare(entry.first) == 0)
                                return entry.second;
                        }
                    return NULL;
                }

            protected:
                static FilterMap* getMap()
                {
                    if(filters != NULL)
                        filters = new FilterMap;
                    return filters;
                }

            private:
                static FilterMap *filters;
            };

            template&lt;typename T&gt;
            struct FilterRegister : FilterFactory
            {
                FilterRegister(const std::string&amp; name)
                {
                    FilterFactory::getMap()-&gt;insert(typename FilterFactory::FilterMap::value_type(name, &amp;createTemplate&lt;T&gt;));
                }
            };

            virtual bool process(TF){return true;}

        protected:
        };
    }
}

#endif // ABSTRACTFILTER_H
</code></pre>
<p>In dieser Zeile:</p>
<pre><code>FilterFactory::getMap()-&gt;insert(typename FilterFactory::FilterMap::value_type(name, &amp;createTemplate&lt;T&gt;));
</code></pre>
<p>tritt nun folgender Compile-Error auf:</p>
<blockquote>
<p>In file included from samplefilter.h:6:0,<br />
from <a href="http://samplefilter.cc:1" rel="nofollow">samplefilter.cc:1</a>:<br />
abstractfilter.hpp: In constructor ‘ccns::util::AbstractFilter&lt;TF&gt;::FilterRegister&lt;T&gt;::FilterRegister(const string&amp;) [with T = ccns::util::SampleFilter, TF = std::basic_string&lt;char&gt;, std::string = std::basic_string&lt;char&gt;]’:<br />
samplefilter.cc:5:125: instantiated from here<br />
abstractfilter.hpp:53:21: error: no matching function for call to ‘std::pair&lt;const std::basic_string&lt;char&gt;, ccns::util::IFilter&lt;std::basic_string&lt;char&gt; &gt;* (<em>)()&gt;::pair(const string&amp;, &lt;unresolved overloaded function type&gt;)’<br />
abstractfilter.hpp:53:21: note: candidates are:<br />
/usr/include/c++/4.6/bits/stl_pair.h:108:21: note: template&lt;class _U1, class _U2&gt; std::pair::pair(const std::pair&lt;_U1, _U2&gt;&amp;)<br />
/usr/include/c++/4.6/bits/stl_pair.h:103:26: note: std::pair&lt;_T1, _T2&gt;::pair(const _T1&amp;, const _T2&amp;) [with _T1 = const std::basic_string&lt;char&gt;, _T2 = ccns::util::IFilter&lt;std::basic_string&lt;char&gt; &gt;</em> (<em>)()]<br />
/usr/include/c++/4.6/bits/stl_pair.h:103:26: note: no known conversion for argument 2 from ‘&lt;unresolved overloaded function type&gt;’ to ‘ccns::util::IFilter&lt;std::basic_string&lt;char&gt; &gt;</em> (* const&amp;)()’<br />
/usr/include/c++/4.6/bits/stl_pair.h:99:26: note: std::pair&lt;_T1, _T2&gt;::pair() [with _T1 = const std::basic_string&lt;char&gt;, _T2 = ccns::util::IFilter&lt;std::basic_string&lt;char&gt; &gt;* (<em>)()]<br />
/usr/include/c++/4.6/bits/stl_pair.h:99:26: note: candidate expects 0 arguments, 2 provided<br />
/usr/include/c++/4.6/bits/stl_pair.h:87:12: note: std::pair&lt;const std::basic_string&lt;char&gt;, ccns::util::IFilter&lt;std::basic_string&lt;char&gt; &gt;</em> (<em>)()&gt;::pair(const std::pair&lt;const std::basic_string&lt;char&gt;, ccns::util::IFilter&lt;std::basic_string&lt;char&gt; &gt;</em> (*)()&gt;&amp;)<br />
/usr/include/c++/4.6/bits/stl_pair.h:87:12: note: candidate expects 1 argument, 2 provided</p>
</blockquote>
<p>Soweit ich die Fehlermeldung verstehe ist der Typ von &amp;createTemplate&lt;T&gt; den Compiler unbekannt.</p>
<p>Meine Fragen dazu:</p>
<p>1. Wieso ist das so?<br />
2. Wie kann ich das Problem lösen?</p>
<p>LG<br />
Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2339806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2339806</guid><dc:creator><![CDATA[daniel_c++]]></dc:creator><pubDate>Fri, 19 Jul 2013 09:08:10 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template: &amp;lt;unresolved overloaded function type&amp;gt; on Fri, 19 Jul 2013 09:51:11 GMT]]></title><description><![CDATA[<p>1. AbstractFilter&lt;TF&gt;::createTemplate&lt;T&gt; ist eine nichtstatische Memberfunktion. Zeiger auf Memberfunktionen sind keine Funktionszeiger (und also inkompatibel mit IFilter&lt;TF&gt;<em>(</em>)()), außerdem können sie stets nur über einen qualifizierten Bezeichner erzeugt werden.</p>
<p>2. createTemplate soll vermutlich static sein</p>
<pre><code class="language-cpp">template&lt;typename T&gt; static IFilter&lt;TF&gt;* createTemplate() {return new T;}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2339815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2339815</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 19 Jul 2013 09:51:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template: &amp;lt;unresolved overloaded function type&amp;gt; on Fri, 19 Jul 2013 10:10:37 GMT]]></title><description><![CDATA[<p>Hey Danke! Jetzt kommt der Compiler schon ein Stück weiter. Alledings bekomme ich immer noch Fehlermeldungen die sehr kryptisch sind <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>
<p>Ich schau mir diese mal genau an und wenn ich nicht weiter komme melde ich mich nochmal.</p>
<p>LG<br />
Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2339822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2339822</guid><dc:creator><![CDATA[daniel_c++]]></dc:creator><pubDate>Fri, 19 Jul 2013 10:10:37 GMT</pubDate></item></channel></rss>