Note that there are some explanatory texts on larger screens.

plurals
  1. POProper syntax of c++ template class constructor that contains internal template class
    primarykey
    data
    text
    <p>I have a class template that in turn contains a template class. That internal template class in turn has as a constructor that takes a function pointer. I've used this internal class before for loading an XML file and now I'm trying my hand at creating an XML converter using this class. The problem is in providing an adequate set of constructor parameters for the internal class.</p> <p><strong>EDIT</strong> I've taken on board some of the comments left regarding temporary const strings, etc., and taken the time to create a simplified case that still exhibits my problem. I've made substantial edits to the question. Using the code posted below the error returned now is </p> <pre><code>FormatConverter/main.cpp:7: instantiated from here FormatConverter/FormatConverter.h:52: error: no matching function for call to 'XMLLoader&lt;MessageType1&gt;::XMLLoader(&lt;unknown type&gt;, const std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;&amp;, const std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;&amp;)' FormatConverter/XMLLoader.h:40: note: candidates are: XMLLoader&lt;XMLTYPE&gt;::XMLLoader(std::auto_ptr&lt;XMLTYPE&gt; (*)(std::istream&amp;, std::string&amp;, std::string&amp;), const std::string&amp;, const std::string&amp;) [with XMLTYPE = MessageType1] FormatConverter/XMLLoader.h:10: note: XMLLoader&lt;MessageType1&gt;::XMLLoader(const XMLLoader&lt;MessageType1&gt;&amp;) </code></pre> <p>//main.cpp</p> <pre><code>#include &lt;iostream&gt; #include "FormatConverter.h" #include "MessageTypes.h" int main (int argc, char * const argv[]) { std::string options = ""; FormatConverter&lt;MessageType1, MessageType2&gt; fConverter( options ); return 0; } </code></pre> <p>//MessageTypes.h</p> <pre><code>#ifndef _MTYPES_ #define _MTYPES_ class MessageType1 { }; class MessageType2 { }; #endif </code></pre> <p>//FormatConverter.h</p> <pre><code>#ifndef _FORMAT_CONVERTER_ #define _FORMAT_CONVERTER_ #include "XMLLoader.h" #include &lt;memory&gt; #include &lt;string&gt; template&lt;typename T&gt; ::std::auto_ptr&lt;T&gt; dummyLoader( ::std::istream&amp; dummyStream, std::string dummyFlags, std::string dummyProps ) { return ::std::auto_ptr&lt;T&gt;( new(T) ); } template&lt;&gt; ::std::auto_ptr&lt;MessageType1&gt; dummyLoader( ::std::istream&amp; dummyStream, std::string dummyFlags, std::string dummyProps ) { return ::std::auto_ptr&lt;MessageType1&gt;( new(MessageType1) ); } template&lt;&gt; ::std::auto_ptr&lt;MessageType2&gt; dummyLoader( ::std::istream&amp; dummyStream, std::string dummyFlags, std::string dummyProps ) { return ::std::auto_ptr&lt;MessageType2&gt;( new(MessageType2) ); } template &lt;typename IN, typename OUT&gt; class FormatConverter { public: FormatConverter( std::string&amp; options ); virtual ~FormatConverter( void ); void convert( std::auto_ptr&lt;IN&gt; input, std::string&amp; stuff ); private: std::string options_; const std::string dummyFlags; const std::string dummyProps; XMLLoader&lt;IN&gt; loader_; }; template &lt;typename IN, typename OUT&gt; FormatConverter&lt;IN, OUT&gt;::FormatConverter( std::string&amp; options ) : options_(options) , dummyFlags("") , dummyProps("") , loader_ ( dummyLoader&lt;IN&gt;, dummyFlags, dummyProps ) { } template &lt;typename IN, typename OUT&gt; FormatConverter&lt;IN,OUT&gt;::~FormatConverter( void ) { } template&lt;typename IN, typename OUT&gt; void FormatConverter&lt;IN, OUT&gt;::convert( std::auto_ptr&lt;IN&gt; input, std::string&amp; stuff ) { } #endif </code></pre> <p>//XMLLoader.h</p> <pre><code>#ifndef _XMLLoader_H #define _XMLLoader_H #include &lt;memory&gt; #include &lt;string&gt; template &lt;typename XMLTYPE&gt; class XMLLoader { public: typedef ::std::auto_ptr&lt;XMLTYPE&gt; MSG_LOADER( std::istream&amp;, std::string&amp;, //flags std::string&amp; ); //properties XMLLoader( MSG_LOADER *loader, const std::string&amp; schemaSource = "NONE", const std::string&amp; ns="" ); virtual ~XMLLoader(void); virtual std::auto_ptr&lt;XMLTYPE&gt; load(std::istream &amp;is); private: MSG_LOADER* loader_; std::string schemaSource_; std::string namespace_; }; #include &lt;unistd.h&gt; #include &lt;stdexcept&gt; #include "XMLLoader.h" template&lt;typename XMLTYPE&gt; XMLLoader&lt;XMLTYPE&gt;::XMLLoader(MSG_LOADER* loader, const std::string&amp; schemaSource, const std::string&amp; ns) : loader_(loader) , schemaSource_(schemaSource) , namespace_(ns) { /* stuff */ } template&lt;typename XMLTYPE&gt; XMLLoader&lt;XMLTYPE&gt;::~XMLLoader( void ) { } template&lt;typename XMLTYPE&gt; ::std::auto_ptr&lt;XMLTYPE&gt; XMLLoader&lt;XMLTYPE&gt;::load( std::istream&amp; is ) { std::string flags = ""; std::string props = ""; return loader_(is, flags, props ); } #include "MessageTypes.h" template XMLLoader&lt;MessageType1&gt;::XMLLoader( MSG_LOADER*, const std::string&amp;, const std::string&amp; ); template XMLLoader&lt;MessageType1&gt;::~XMLLoader( void ); template XMLLoader&lt;MessageType2&gt;::XMLLoader( MSG_LOADER*, const std::string&amp;, const std::string&amp; ); template XMLLoader&lt;MessageType2&gt;::~XMLLoader( void ); #endif </code></pre> <p>an XMLLoader&lt;IN&gt; constructor takes 3 arguments: two strings, and a function pointer. It returns an auto_ptr&lt;IN&gt; type. My dummyLoader templates seem to satisfy that requirement and I've tried a number of slight variations to my syntax, yet error refers to an .</p> <p>So, the compiler can't seem to identify the type of dummyLoader I'm trying to pass when instantiating a FormatConverter object. Can anyone explain why?</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload