<?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 beim Export bzw. Import von Templates bei dll]]></title><description><![CDATA[<p>Also ich hab ein seltsames Problem. In einem Projekt das ich von VS 6 auf VS2005 übernommen hab verwende ich viele Templates.<br />
Ich exportiere diese Templateklassen in der DLL und importiere sie später in meinem testprogramm ... naja soweit so gut. Unter VS 6 hat es ja einwandfrei funktioniert ... nur unter 2005 bekomm ich lästige linkerfehler.</p>
<p>wegbekommen tu ich das ganze nur wenn ich die export bzw. importroutinen (sind jeweils die gleichen dateien werden aber ggf. durch präprozessoranweisung auf import oder export gepolt) weglasse (Was ja auch logisch ist wenn es nicht mehr exportiert wird und logischer weise nicht mehr importiert)</p>
<p>ich kann meine projekte auch wahlweise auf statisches linken umstellen ... dort logischerweise auch kein fehler.</p>
<p>Nur warum geht es in dem einen und im anderen nicht und wo ist der sinn bzw. unsinn in diesem verhalten.</p>
<p>ich hab mal den code so weit vereinfacht dass ihn - so hoffe ich - auch andere leute verstehen können. die sourcecode doku ist zum teil noch drin sollte auch zur verständlichkeit beitragen.</p>
<p>also an namespaces wie mlib oder so liegt es nicht ... wie gesagt und vs6 läuft der spass ja ...</p>
<p>das steht in der dll</p>
<pre><code class="language-cpp">class __declspec(dllexport) MFunctor
{
  public:
    /** @brief Default Constructor.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    MFunctor( void )
    {
    } 

    /** @brief Copy Constructor.
      *
      * @param func zu kopierendes Functor-Objekt.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    MFunctor(
      const MFunctor&amp; func
    )
    {     
    }

    /** @brief Destructor.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual ~MFunctor( void ) throw()
    {
    }

    /** @brief Klonen des Functor-Objekts
      *
      * @return Zeiger auf das neu erzeugte, geklonte Objekt.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual MFunctor* Clone( void ) = 0 ;

    /** @brief Ausfuehren der Methode des Klassenobjekts.
      *
      * @param arg Methodenargument
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual void Execute(
      const MFunctorArg&amp; arg
    ) = 0 ;
};

template &lt; class TObject &gt;
class __declspec(dllexport) MFunctor0Tmpl : public MFunctor
{
  public:
    /** Typedef fuer den Funktionstyp */
    typedef void (TObject::*PClassCB)( void ) ;

    /** @brief Default Constructor.
      *
      * Der Konstruktor initialisiert das Functor-Objekt, in dem er sich die Objektadresse
      * sowie die Methodenadresse der Objektinstanz merkt.
      *
      * @param object Zeiger auf das Objekt das die Methode enthaehlt 
      * @param method Zeiger auf die Methode
      *
      * @throws Diese Methode generiert keine Exception.
    */
    MFunctor0Tmpl(
      TObject&amp; object,
      PClassCB method
    ) : mObject( &amp;object ), mMethod( method )
    {
    }

    /** @brief Copy Constructor.
      *
      * @param functor zu kopierendes Functor-Objekt.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    MFunctor0Tmpl(
      const MFunctor0Tmpl&lt; TObject &gt;&amp; functor
    ) : mObject( functor.mObject ), mMethod( functor.mMethod )
    {
    }

    /** @brief Destructor.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual ~MFunctor0Tmpl( void ) throw()
    {
    }

    /** @brief Klonen des Functor-Objekts
      *
      * @return Zeiger auf das neu erzeugte, geklonte Objekt.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual MFunctor* Clone( void )
    {
      return new MFunctor0Tmpl&lt; TObject &gt;( *this ) ;
    }

    /** @brief Ausfuehren der Methode des Klassenobjekts.
      *
      * @param arg Methodenargument
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual void Execute( const MFunctorArg&amp; arg = MFunctorArg() )
    {
      (mObject-&gt;*mMethod)() ;
    }

  private:
    /** Zeiger auf das Objekt, dessen Methode ausgefuehrt werden soll. */
    TObject* mObject;                 

    /** Funktionszeiger auf die Objektmethode */
    PClassCB mMethod ;
} ;
</code></pre>
<p>das in meinem testprogramm</p>
<pre><code class="language-cpp">class __declspec(dllimport) MFunctor
{
  public:
    /** @brief Default Constructor.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    MFunctor( void )
    {
    } 

    /** @brief Copy Constructor.
      *
      * @param func zu kopierendes Functor-Objekt.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    MFunctor(
      const MFunctor&amp; func
    )
    {     
    }

    /** @brief Destructor.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual ~MFunctor( void ) throw()
    {
    }

    /** @brief Klonen des Functor-Objekts
      *
      * @return Zeiger auf das neu erzeugte, geklonte Objekt.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual MFunctor* Clone( void ) = 0 ;

    /** @brief Ausfuehren der Methode des Klassenobjekts.
      *
      * @param arg Methodenargument
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual void Execute(
      const MFunctorArg&amp; arg
    ) = 0 ;
};

template &lt; class TObject &gt;
class __declspec(dllimport) MFunctor0Tmpl : public MFunctor
{
  public:
    /** Typedef fuer den Funktionstyp */
    typedef void (TObject::*PClassCB)( void ) ;

    /** @brief Default Constructor.
      *
      * Der Konstruktor initialisiert das Functor-Objekt, in dem er sich die Objektadresse
      * sowie die Methodenadresse der Objektinstanz merkt.
      *
      * @param object Zeiger auf das Objekt das die Methode enthaehlt 
      * @param method Zeiger auf die Methode
      *
      * @throws Diese Methode generiert keine Exception.
    */
    MFunctor0Tmpl(
      TObject&amp; object,
      PClassCB method
    ) : mObject( &amp;object ), mMethod( method )
    {
    }

    /** @brief Copy Constructor.
      *
      * @param functor zu kopierendes Functor-Objekt.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    MFunctor0Tmpl(
      const MFunctor0Tmpl&lt; TObject &gt;&amp; functor
    ) : mObject( functor.mObject ), mMethod( functor.mMethod )
    {
    }

    /** @brief Destructor.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual ~MFunctor0Tmpl( void ) throw()
    {
    }

    /** @brief Klonen des Functor-Objekts
      *
      * @return Zeiger auf das neu erzeugte, geklonte Objekt.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual MFunctor* Clone( void )
    {
      return new MFunctor0Tmpl&lt; TObject &gt;( *this ) ;
    }

    /** @brief Ausfuehren der Methode des Klassenobjekts.
      *
      * @param arg Methodenargument
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual void Execute( const MFunctorArg&amp; arg = MFunctorArg() )
    {
      (mObject-&gt;*mMethod)() ;
    }

  private:
    /** Zeiger auf das Objekt, dessen Methode ausgefuehrt werden soll. */
    TObject* mObject;                 

    /** Funktionszeiger auf die Objektmethode */
    PClassCB mMethod ;
} ;

class TestClassA
{
  public:
    // Constructor
    TestClassA( void ) {}

    // Destructor
    virtual ~TestClassA( void ) throw() {}

    // Methode ohne Argument
    void Function0( void )
    {
      mBuffer &lt;&lt; &quot;TestClassA: Aufruf ohne Argument&quot; &lt;&lt; '\n' ;
    }

    // Argumenttyp mit 1 Argument fuer die Methode 'Function1'
    typedef mlib::MFunctorArg1&lt; mlib::MString &gt; Arg1 ;

    // Methode mit 1 Argument
    void Function1(
      const Arg1&amp; arg
    )
    {
      mBuffer
        &lt;&lt; &quot;TestClassA: &quot;
        &lt;&lt; arg.Arg1() &lt;&lt; '\n' ;
    }

    // Argumenttyp mit 2 Argumenten fuer die Methode 'Function2'
    typedef mlib::MFunctorArg2&lt; mlib::MString, double &gt; Arg2 ;

    // Methode mit 2 Argumenten
    void Function2(
      const Arg2&amp; arg
    )
    {
      mBuffer
        &lt;&lt; &quot;TestClassA: &quot;
        &lt;&lt; arg.Arg1()
        &lt;&lt; &quot;: value = &quot; &lt;&lt; arg.Arg2()
        &lt;&lt; '\n' ;
    }

    // Argumenttyp mit 3 Argumenten fuer die Methode 'Function3'
    typedef mlib::MFunctorArg3&lt; mlib::MString, double, bool &gt; Arg3 ;

    // Methode mit 3 Argumenten
    void Function3(
      const Arg3&amp; arg
    )
    {
      mBuffer
        &lt;&lt; &quot;TestClassA: &quot;
        &lt;&lt; arg.Arg1()
        &lt;&lt; &quot;: value = &quot; &lt;&lt; arg.Arg2()
        &lt;&lt; &quot;; state = &quot; &lt;&lt; ( arg.Arg3() ? &quot;active&quot; : &quot;inactive&quot; )
        &lt;&lt; '\n' ;
    }

    // Printmethode zur Ausgabe des Stream-Buffers
    std::ostream&amp; Print(
      std::ostream&amp; os
    )
    {
      os &lt;&lt; mBuffer.str() ;

      return os ;
    }

  protected:
    // Stream-Buffer
    std::stringstream mBuffer ;
} ;

void MFunctor_Sample(
  std::ostream&amp;        os,
  const mlib::MString&amp; iFileName,
  const mlib::MString&amp; oFileName,
  int                  num,
  int                  argc,
  char**               argv
)
{
  os &lt;&lt; &quot;1. Aufruf der Methoden von Klasse TestClassA mit Functor-Argumenten\n&quot; &lt;&lt; std::endl ;

  // Definition der Functor-Datentypen
  typedef mlib::MFunctor0Tmpl&lt; TestClassA &gt; Functor0 ;

  // Instanz von 'TestClassA' erzeugen
  TestClassA testA ;

  // Methoden von Klasse 'TestClassA' ueber Functor aufrufen
  Functor0( testA, &amp;TestClassA::Function0 ).Execute() ;
}
</code></pre>
<p>hier die fehler</p>
<p>MFunctor_Example.obj : error LNK2019: unresolved external symbol &quot;__declspec(dllimport) public: virtual __thiscall mlib::MFunctor0Tmpl&lt;class TestClassA&gt;::~MFunctor0Tmpl&lt;class TestClassA&gt;(void)&quot; (__imp_??1?MFunctor0Tmpl@VTestClassA@@@mlib@@UAE@XZ) referenced in function "void \_\_cdecl MFunctor\_Sample(class std::basic\_ostream<char,struct std::char\_traits<char> > &,class mlib::MString const &,class mlib::MString const &,int,int,char * *)" (?MFunctor\_Sample@@YAXAAV?basic_ostream@DU?char_traits@D@std@@@std@@ABVMString@mlib@@1HHPAPAD@Z)  
MFunctor\_Example.obj : error LNK2019: unresolved external symbol "\_\_declspec(dllimport) public: \_\_thiscall mlib::MFunctor0Tmpl<class TestClassA>::MFunctor0Tmpl<class TestClassA>(class TestClassA &,void (\_\_thiscall TestClassA::*)(void))" (\_\_imp\_??0?MFunctor0Tmpl@VTestClassA@@@mlib@@QAE@AAVTestClassA@@P82@AEXXZ@Z) referenced in function &quot;void __cdecl MFunctor_Sample(class std::basic_ostream&lt;char,struct std::char_traits&lt;char&gt; &gt; &amp;,class mlib::MString const &amp;,class mlib::MString const &amp;,int,int,char * *)&quot; (?MFunctor_Sample@@YAXAAV?<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>b</mi><mi>a</mi><mi>s</mi><mi>i</mi><mi>c</mi><mi mathvariant="normal">_</mi><mi>o</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>e</mi><mi>a</mi><mi>m</mi><mi mathvariant="normal">@</mi><mi>D</mi><mi>U</mi><mo>?</mo></mrow><annotation encoding="application/x-tex">basic\_ostream@DU?</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:1.00444em;vertical-align:-0.31em;"></span><span class="base textstyle uncramped"><span class="mord mathit">b</span><span class="mord mathit">a</span><span class="mord mathit">s</span><span class="mord mathit">i</span><span class="mord mathit">c</span><span class="mord mathrm" style="margin-right:0.02778em;">_</span><span class="mord mathit">o</span><span class="mord mathit">s</span><span class="mord mathit">t</span><span class="mord mathit" style="margin-right:0.02778em;">r</span><span class="mord mathit">e</span><span class="mord mathit">a</span><span class="mord mathit">m</span><span class="mord mathrm">@</span><span class="mord mathit" style="margin-right:0.02778em;">D</span><span class="mord mathit" style="margin-right:0.10903em;">U</span><span class="mclose">?</span></span></span></span>char_traits@D@std@@@std@@ABVMString@mlib@@1HHPAPAD@Z)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/163262/problem-beim-export-bzw-import-von-templates-bei-dll</link><generator>RSS for Node</generator><lastBuildDate>Thu, 30 Jul 2026 08:22:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/163262.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 27 Oct 2006 15:12:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem beim Export bzw. Import von Templates bei dll on Fri, 27 Oct 2006 15:15:30 GMT]]></title><description><![CDATA[<p>Also ich hab ein seltsames Problem. In einem Projekt das ich von VS 6 auf VS2005 übernommen hab verwende ich viele Templates.<br />
Ich exportiere diese Templateklassen in der DLL und importiere sie später in meinem testprogramm ... naja soweit so gut. Unter VS 6 hat es ja einwandfrei funktioniert ... nur unter 2005 bekomm ich lästige linkerfehler.</p>
<p>wegbekommen tu ich das ganze nur wenn ich die export bzw. importroutinen (sind jeweils die gleichen dateien werden aber ggf. durch präprozessoranweisung auf import oder export gepolt) weglasse (Was ja auch logisch ist wenn es nicht mehr exportiert wird und logischer weise nicht mehr importiert)</p>
<p>ich kann meine projekte auch wahlweise auf statisches linken umstellen ... dort logischerweise auch kein fehler.</p>
<p>Nur warum geht es in dem einen und im anderen nicht und wo ist der sinn bzw. unsinn in diesem verhalten.</p>
<p>ich hab mal den code so weit vereinfacht dass ihn - so hoffe ich - auch andere leute verstehen können. die sourcecode doku ist zum teil noch drin sollte auch zur verständlichkeit beitragen.</p>
<p>also an namespaces wie mlib oder so liegt es nicht ... wie gesagt und vs6 läuft der spass ja ...</p>
<p>das steht in der dll</p>
<pre><code class="language-cpp">class __declspec(dllexport) MFunctor
{
  public:
    /** @brief Default Constructor.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    MFunctor( void )
    {
    } 

    /** @brief Copy Constructor.
      *
      * @param func zu kopierendes Functor-Objekt.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    MFunctor(
      const MFunctor&amp; func
    )
    {     
    }

    /** @brief Destructor.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual ~MFunctor( void ) throw()
    {
    }

    /** @brief Klonen des Functor-Objekts
      *
      * @return Zeiger auf das neu erzeugte, geklonte Objekt.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual MFunctor* Clone( void ) = 0 ;

    /** @brief Ausfuehren der Methode des Klassenobjekts.
      *
      * @param arg Methodenargument
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual void Execute(
      const MFunctorArg&amp; arg
    ) = 0 ;
};

template &lt; class TObject &gt;
class __declspec(dllexport) MFunctor0Tmpl : public MFunctor
{
  public:
    /** Typedef fuer den Funktionstyp */
    typedef void (TObject::*PClassCB)( void ) ;

    /** @brief Default Constructor.
      *
      * Der Konstruktor initialisiert das Functor-Objekt, in dem er sich die Objektadresse
      * sowie die Methodenadresse der Objektinstanz merkt.
      *
      * @param object Zeiger auf das Objekt das die Methode enthaehlt 
      * @param method Zeiger auf die Methode
      *
      * @throws Diese Methode generiert keine Exception.
    */
    MFunctor0Tmpl(
      TObject&amp; object,
      PClassCB method
    ) : mObject( &amp;object ), mMethod( method )
    {
    }

    /** @brief Copy Constructor.
      *
      * @param functor zu kopierendes Functor-Objekt.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    MFunctor0Tmpl(
      const MFunctor0Tmpl&lt; TObject &gt;&amp; functor
    ) : mObject( functor.mObject ), mMethod( functor.mMethod )
    {
    }

    /** @brief Destructor.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual ~MFunctor0Tmpl( void ) throw()
    {
    }

    /** @brief Klonen des Functor-Objekts
      *
      * @return Zeiger auf das neu erzeugte, geklonte Objekt.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual MFunctor* Clone( void )
    {
      return new MFunctor0Tmpl&lt; TObject &gt;( *this ) ;
    }

    /** @brief Ausfuehren der Methode des Klassenobjekts.
      *
      * @param arg Methodenargument
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual void Execute( const MFunctorArg&amp; arg = MFunctorArg() )
    {
      (mObject-&gt;*mMethod)() ;
    }

  private:
    /** Zeiger auf das Objekt, dessen Methode ausgefuehrt werden soll. */
    TObject* mObject;                 

    /** Funktionszeiger auf die Objektmethode */
    PClassCB mMethod ;
} ;
</code></pre>
<p>das in meinem testprogramm</p>
<pre><code class="language-cpp">class __declspec(dllimport) MFunctor
{
  public:
    /** @brief Default Constructor.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    MFunctor( void )
    {
    } 

    /** @brief Copy Constructor.
      *
      * @param func zu kopierendes Functor-Objekt.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    MFunctor(
      const MFunctor&amp; func
    )
    {     
    }

    /** @brief Destructor.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual ~MFunctor( void ) throw()
    {
    }

    /** @brief Klonen des Functor-Objekts
      *
      * @return Zeiger auf das neu erzeugte, geklonte Objekt.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual MFunctor* Clone( void ) = 0 ;

    /** @brief Ausfuehren der Methode des Klassenobjekts.
      *
      * @param arg Methodenargument
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual void Execute(
      const MFunctorArg&amp; arg
    ) = 0 ;
};

template &lt; class TObject &gt;
class __declspec(dllimport) MFunctor0Tmpl : public MFunctor
{
  public:
    /** Typedef fuer den Funktionstyp */
    typedef void (TObject::*PClassCB)( void ) ;

    /** @brief Default Constructor.
      *
      * Der Konstruktor initialisiert das Functor-Objekt, in dem er sich die Objektadresse
      * sowie die Methodenadresse der Objektinstanz merkt.
      *
      * @param object Zeiger auf das Objekt das die Methode enthaehlt 
      * @param method Zeiger auf die Methode
      *
      * @throws Diese Methode generiert keine Exception.
    */
    MFunctor0Tmpl(
      TObject&amp; object,
      PClassCB method
    ) : mObject( &amp;object ), mMethod( method )
    {
    }

    /** @brief Copy Constructor.
      *
      * @param functor zu kopierendes Functor-Objekt.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    MFunctor0Tmpl(
      const MFunctor0Tmpl&lt; TObject &gt;&amp; functor
    ) : mObject( functor.mObject ), mMethod( functor.mMethod )
    {
    }

    /** @brief Destructor.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual ~MFunctor0Tmpl( void ) throw()
    {
    }

    /** @brief Klonen des Functor-Objekts
      *
      * @return Zeiger auf das neu erzeugte, geklonte Objekt.
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual MFunctor* Clone( void )
    {
      return new MFunctor0Tmpl&lt; TObject &gt;( *this ) ;
    }

    /** @brief Ausfuehren der Methode des Klassenobjekts.
      *
      * @param arg Methodenargument
      *
      * @throws Diese Methode generiert keine Exception.
    */
    virtual void Execute( const MFunctorArg&amp; arg = MFunctorArg() )
    {
      (mObject-&gt;*mMethod)() ;
    }

  private:
    /** Zeiger auf das Objekt, dessen Methode ausgefuehrt werden soll. */
    TObject* mObject;                 

    /** Funktionszeiger auf die Objektmethode */
    PClassCB mMethod ;
} ;

class TestClassA
{
  public:
    // Constructor
    TestClassA( void ) {}

    // Destructor
    virtual ~TestClassA( void ) throw() {}

    // Methode ohne Argument
    void Function0( void )
    {
      mBuffer &lt;&lt; &quot;TestClassA: Aufruf ohne Argument&quot; &lt;&lt; '\n' ;
    }

    // Argumenttyp mit 1 Argument fuer die Methode 'Function1'
    typedef mlib::MFunctorArg1&lt; mlib::MString &gt; Arg1 ;

    // Methode mit 1 Argument
    void Function1(
      const Arg1&amp; arg
    )
    {
      mBuffer
        &lt;&lt; &quot;TestClassA: &quot;
        &lt;&lt; arg.Arg1() &lt;&lt; '\n' ;
    }

    // Argumenttyp mit 2 Argumenten fuer die Methode 'Function2'
    typedef mlib::MFunctorArg2&lt; mlib::MString, double &gt; Arg2 ;

    // Methode mit 2 Argumenten
    void Function2(
      const Arg2&amp; arg
    )
    {
      mBuffer
        &lt;&lt; &quot;TestClassA: &quot;
        &lt;&lt; arg.Arg1()
        &lt;&lt; &quot;: value = &quot; &lt;&lt; arg.Arg2()
        &lt;&lt; '\n' ;
    }

    // Argumenttyp mit 3 Argumenten fuer die Methode 'Function3'
    typedef mlib::MFunctorArg3&lt; mlib::MString, double, bool &gt; Arg3 ;

    // Methode mit 3 Argumenten
    void Function3(
      const Arg3&amp; arg
    )
    {
      mBuffer
        &lt;&lt; &quot;TestClassA: &quot;
        &lt;&lt; arg.Arg1()
        &lt;&lt; &quot;: value = &quot; &lt;&lt; arg.Arg2()
        &lt;&lt; &quot;; state = &quot; &lt;&lt; ( arg.Arg3() ? &quot;active&quot; : &quot;inactive&quot; )
        &lt;&lt; '\n' ;
    }

    // Printmethode zur Ausgabe des Stream-Buffers
    std::ostream&amp; Print(
      std::ostream&amp; os
    )
    {
      os &lt;&lt; mBuffer.str() ;

      return os ;
    }

  protected:
    // Stream-Buffer
    std::stringstream mBuffer ;
} ;

void MFunctor_Sample(
  std::ostream&amp;        os,
  const mlib::MString&amp; iFileName,
  const mlib::MString&amp; oFileName,
  int                  num,
  int                  argc,
  char**               argv
)
{
  os &lt;&lt; &quot;1. Aufruf der Methoden von Klasse TestClassA mit Functor-Argumenten\n&quot; &lt;&lt; std::endl ;

  // Definition der Functor-Datentypen
  typedef mlib::MFunctor0Tmpl&lt; TestClassA &gt; Functor0 ;

  // Instanz von 'TestClassA' erzeugen
  TestClassA testA ;

  // Methoden von Klasse 'TestClassA' ueber Functor aufrufen
  Functor0( testA, &amp;TestClassA::Function0 ).Execute() ;
}
</code></pre>
<p>hier die fehler</p>
<p>MFunctor_Example.obj : error LNK2019: unresolved external symbol &quot;__declspec(dllimport) public: virtual __thiscall mlib::MFunctor0Tmpl&lt;class TestClassA&gt;::~MFunctor0Tmpl&lt;class TestClassA&gt;(void)&quot; (__imp_??1?MFunctor0Tmpl@VTestClassA@@@mlib@@UAE@XZ) referenced in function "void \_\_cdecl MFunctor\_Sample(class std::basic\_ostream<char,struct std::char\_traits<char> > &,class mlib::MString const &,class mlib::MString const &,int,int,char * *)" (?MFunctor\_Sample@@YAXAAV?basic_ostream@DU?char_traits@D@std@@@std@@ABVMString@mlib@@1HHPAPAD@Z)  
MFunctor\_Example.obj : error LNK2019: unresolved external symbol "\_\_declspec(dllimport) public: \_\_thiscall mlib::MFunctor0Tmpl<class TestClassA>::MFunctor0Tmpl<class TestClassA>(class TestClassA &,void (\_\_thiscall TestClassA::*)(void))" (\_\_imp\_??0?MFunctor0Tmpl@VTestClassA@@@mlib@@QAE@AAVTestClassA@@P82@AEXXZ@Z) referenced in function &quot;void __cdecl MFunctor_Sample(class std::basic_ostream&lt;char,struct std::char_traits&lt;char&gt; &gt; &amp;,class mlib::MString const &amp;,class mlib::MString const &amp;,int,int,char * *)&quot; (?MFunctor_Sample@@YAXAAV?<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>b</mi><mi>a</mi><mi>s</mi><mi>i</mi><mi>c</mi><mi mathvariant="normal">_</mi><mi>o</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>e</mi><mi>a</mi><mi>m</mi><mi mathvariant="normal">@</mi><mi>D</mi><mi>U</mi><mo>?</mo></mrow><annotation encoding="application/x-tex">basic\_ostream@DU?</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:1.00444em;vertical-align:-0.31em;"></span><span class="base textstyle uncramped"><span class="mord mathit">b</span><span class="mord mathit">a</span><span class="mord mathit">s</span><span class="mord mathit">i</span><span class="mord mathit">c</span><span class="mord mathrm" style="margin-right:0.02778em;">_</span><span class="mord mathit">o</span><span class="mord mathit">s</span><span class="mord mathit">t</span><span class="mord mathit" style="margin-right:0.02778em;">r</span><span class="mord mathit">e</span><span class="mord mathit">a</span><span class="mord mathit">m</span><span class="mord mathrm">@</span><span class="mord mathit" style="margin-right:0.02778em;">D</span><span class="mord mathit" style="margin-right:0.10903em;">U</span><span class="mclose">?</span></span></span></span>char_traits@D@std@@@std@@ABVMString@mlib@@1HHPAPAD@Z)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1162607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1162607</guid><dc:creator><![CDATA[Jason_Frost]]></dc:creator><pubDate>Fri, 27 Oct 2006 15:15:30 GMT</pubDate></item></channel></rss>