<?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]]></title><description><![CDATA[<p>hi leute,</p>
<p>ich habe folgendes problem: ich habe zwei klassen definiert. eine klasse Object und eine klasse MetaClass.<br />
MetaClass ist dabei eine templateklasse und bietet metafunktionalität. Object hat einen zeiger auf ein objekt von MetaClass.</p>
<p>das ganze sieht so aus:</p>
<pre><code>template &lt;class T&gt;
class MetaClass {
T *							client;
public:
	bool						client_is_abstract			() const;
	char const *				get_client_class_name		() const;
	char const *				get_client_class_name_base	() const;
	MetaClass&lt;T&gt; const &amp;		get_client_metaclass		() const;
	MetaClass&lt;T&gt; const *		get_client_metaclass_base	() const;
	size_t						get_client_size				() const;
	size_t						get_client_version			() const;
	T &amp;							instantiate_new_client		() const;
	T &amp;							clone_client				() const;

								MetaClass&lt;T&gt;				()
};

class Object {
	MetaClass&lt;Object&gt; *			meta_class;

public:
	Object &amp;					clone						() const;
	char const *				get_class_name				() const;
	char const *				get_class_name_base			() const;
	size_t						get_class_size				() const;
	size_t						get_class_version			() const;
	MetaClass&lt;Object&gt; const &amp;	get_metaclass				() const;
	MetaClass&lt;Object&gt; const *	get_metaclass_base			() const;
	Object &amp;					instantiate_new				() const;
	bool						is							(char const * const name) const;
	bool						is_a						(char const * const name) const;
	bool						is_abstract					() const;

	void						set_prototype				(MetaClass&lt;Object&gt; *);

								Object						();
								~Object						();
};
</code></pre>
<p>die methoden von Object sollen aufgaben an MetaClass weiterdelegieren.<br />
zwei ausgewählte methoden sehen so aus:</p>
<pre><code>Object &amp; Object::clone () const {
	return this-&gt;meta_class-&gt;clone_client();
}

template &lt;class T&gt;
T &amp; MetaClass&lt;T&gt;::clone_client () const {
	T * cloned_client = new T(*client);
	return *cloned_client;
}
</code></pre>
<p>beim kompilieren habe ich aber folgenden linker-fehler:<br />
Error 1 error LNK2019: unresolved external symbol &quot;public: class Object &amp; __thiscall MetaClass&lt;class Object&gt;::clone_client(void)const &quot; (?clone_client@?$MetaClass@VObject@@@@QBEAAVObject@@XZ) referenced in function &quot;public: class Object &amp; __thiscall Object::clone(void)const &quot; (?clone@Object@@QBEAAV1@XZ) Object.obj</p>
<p>der linker findet die methode MetaClass::clone_client nicht, die in Object::clone aufgerufen wird. warum?</p>
<p>irgendwie muss das was mit dem template zu tun haben... wenn ich die methode wirklich konkret für Object schreibe funktioniert es. die allgemeine template methode mit T scheint der linker nicht zu mögen.</p>
<p>wie kann ich die syntax korrigieren, aber trotzdem sicherstellen, dass die methoden &quot;allgemein&quot; funktionieren?</p>
<p>lg t</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/142115/problem-mit-template</link><generator>RSS for Node</generator><lastBuildDate>Tue, 01 Sep 2026 14:50:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/142115.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 27 Mar 2006 20:54:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to problem mit template on Mon, 27 Mar 2006 20:54:03 GMT]]></title><description><![CDATA[<p>hi leute,</p>
<p>ich habe folgendes problem: ich habe zwei klassen definiert. eine klasse Object und eine klasse MetaClass.<br />
MetaClass ist dabei eine templateklasse und bietet metafunktionalität. Object hat einen zeiger auf ein objekt von MetaClass.</p>
<p>das ganze sieht so aus:</p>
<pre><code>template &lt;class T&gt;
class MetaClass {
T *							client;
public:
	bool						client_is_abstract			() const;
	char const *				get_client_class_name		() const;
	char const *				get_client_class_name_base	() const;
	MetaClass&lt;T&gt; const &amp;		get_client_metaclass		() const;
	MetaClass&lt;T&gt; const *		get_client_metaclass_base	() const;
	size_t						get_client_size				() const;
	size_t						get_client_version			() const;
	T &amp;							instantiate_new_client		() const;
	T &amp;							clone_client				() const;

								MetaClass&lt;T&gt;				()
};

class Object {
	MetaClass&lt;Object&gt; *			meta_class;

public:
	Object &amp;					clone						() const;
	char const *				get_class_name				() const;
	char const *				get_class_name_base			() const;
	size_t						get_class_size				() const;
	size_t						get_class_version			() const;
	MetaClass&lt;Object&gt; const &amp;	get_metaclass				() const;
	MetaClass&lt;Object&gt; const *	get_metaclass_base			() const;
	Object &amp;					instantiate_new				() const;
	bool						is							(char const * const name) const;
	bool						is_a						(char const * const name) const;
	bool						is_abstract					() const;

	void						set_prototype				(MetaClass&lt;Object&gt; *);

								Object						();
								~Object						();
};
</code></pre>
<p>die methoden von Object sollen aufgaben an MetaClass weiterdelegieren.<br />
zwei ausgewählte methoden sehen so aus:</p>
<pre><code>Object &amp; Object::clone () const {
	return this-&gt;meta_class-&gt;clone_client();
}

template &lt;class T&gt;
T &amp; MetaClass&lt;T&gt;::clone_client () const {
	T * cloned_client = new T(*client);
	return *cloned_client;
}
</code></pre>
<p>beim kompilieren habe ich aber folgenden linker-fehler:<br />
Error 1 error LNK2019: unresolved external symbol &quot;public: class Object &amp; __thiscall MetaClass&lt;class Object&gt;::clone_client(void)const &quot; (?clone_client@?$MetaClass@VObject@@@@QBEAAVObject@@XZ) referenced in function &quot;public: class Object &amp; __thiscall Object::clone(void)const &quot; (?clone@Object@@QBEAAV1@XZ) Object.obj</p>
<p>der linker findet die methode MetaClass::clone_client nicht, die in Object::clone aufgerufen wird. warum?</p>
<p>irgendwie muss das was mit dem template zu tun haben... wenn ich die methode wirklich konkret für Object schreibe funktioniert es. die allgemeine template methode mit T scheint der linker nicht zu mögen.</p>
<p>wie kann ich die syntax korrigieren, aber trotzdem sicherstellen, dass die methoden &quot;allgemein&quot; funktionieren?</p>
<p>lg t</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1025133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1025133</guid><dc:creator><![CDATA[steininger]]></dc:creator><pubDate>Mon, 27 Mar 2006 20:54:03 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit template on Mon, 27 Mar 2006 22:20:00 GMT]]></title><description><![CDATA[<p>Nur mal so ins Blaue: Hast Du die Implementierung der Template-Methode in einer eigenen cpp-Datei geschrieben und nicht im Header?</p>
<p>Laut Standard kann man zwar auch bei Templates Definition und Implementierung in getrennten Dateien verwalten (soweit ich weiß), aber kein Compiler (soweit ich weiß) unterstützt dies. Da muss die Implementierung komplett in den Header.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1025179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1025179</guid><dc:creator><![CDATA[mantiz]]></dc:creator><pubDate>Mon, 27 Mar 2006 22:20:00 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit template on Tue, 28 Mar 2006 12:07:16 GMT]]></title><description><![CDATA[<p>wow super, das war der fehler!<br />
danke!</p>
<p>eine alternative lösung ist die cpp files unten in den header files einzubinden.</p>
<p>lg johnny</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1025458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1025458</guid><dc:creator><![CDATA[steininger]]></dc:creator><pubDate>Tue, 28 Mar 2006 12:07:16 GMT</pubDate></item></channel></rss>