 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Bastian Blank Guest
|
Posted: Sun Apr 24, 2005 11:14 am Post subject: Konvertierung zwischen Template-Instanziierungen |
|
|
Ich habe ein Template, das ähnlich aufgebaut ist wie viele der
STL-Templates beim gcc:
| Quote: | template <typename type, typename allocator
|
Jetzt möchte ich Objekte mit unterschiedlichen Allokatoren auseinander
konstruieren:
| Quote: | test
test<char, alloc2> t2 (t1);
|
Die beiden Typen sind nicht kompatibel.
Lösung 1:
| Quote: | template <typename type
class test_base
{ };
template
class test : public test_base
{
public:
test (const test_base
};
|
Problem: Der Konstruktor kann nur auf public Methoden von
test_base<type> zugreifen.
Lösung 2:
| Quote: | template <typename type, typename allocator
class test
{
public:
template
test (const test
};
|
Problem: Das selbe wie Lösung 1.
Gibt es für dieses Problem eine Lösung die nicht "friend" heisst, was
bei solchen Templates sowieso nicht praktikabel ist?
Bastian
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Torsten Robitzki Guest
|
Posted: Sun Apr 24, 2005 12:03 pm Post subject: Re: Konvertierung zwischen Template-Instanziierungen |
|
|
Bastian Blank wrote:
| Quote: | Ich habe ein Template, das ähnlich aufgebaut ist wie viele der
STL-Templates beim gcc:
| template <typename type, typename allocator
Jetzt möchte ich Objekte mit unterschiedlichen Allokatoren auseinander
konstruieren:
| test
| test<char, alloc2> t2 (t1);
Die beiden Typen sind nicht kompatibel.
|
<snip>
| Quote: | Gibt es für dieses Problem eine Lösung die nicht "friend" heisst, was
bei solchen Templates sowieso nicht praktikabel ist?
|
Wenn es geht, nimm einfach hin, das es zweit unterschiedliche Typen
sind. Um t2 aus t1 zu konstruieren, kannst Du einfach die Konstruktor
Variante nehmen, die zwei Iteratoren nimmt:
test<char, alloc2> t2(t1.begin(), t1.end());
mfg Torsten
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Mang Guest
|
Posted: Sun Apr 24, 2005 9:10 pm Post subject: Re: Konvertierung zwischen Template-Instanziierungen |
|
|
"Bastian Blank" <usenet (AT) waldi (DOT) eu.org> schrieb im Newsbeitrag
news:slrnd6mvsl.lvb.usenet (AT) mobilewave (DOT) waldi.eu.org...
| Quote: | Ich habe ein Template, das ähnlich aufgebaut ist wie viele der
STL-Templates beim gcc:
| template <typename type, typename allocator
Jetzt möchte ich Objekte mit unterschiedlichen Allokatoren auseinander
konstruieren:
| test
| test<char, alloc2> t2 (t1);
Die beiden Typen sind nicht kompatibel.
Lösung 1:
| template <typename type
| class test_base
| { };
|
| template
| class test : public test_base
| {
| public:
| test (const test_base
| };
Problem: Der Konstruktor kann nur auf public Methoden von
test_base<type> zugreifen.
Lösung 2:
| template <typename type, typename allocator
| class test
| {
| public:
| template
| test (const test
| };
Problem: Das selbe wie Lösung 1.
Gibt es für dieses Problem eine Lösung die nicht "friend" heisst, was
bei solchen Templates sowieso nicht praktikabel ist?
|
Und wieso nicht?
Tatsache ist, daß ein test<x, alloc1> kein test<x, alloc2> ist, sondern eine
_vollkommen unabhängige_ Klasse. Also gibt sich test<x, alloc2> entweder mit
dem public-interface von test<x, alloc1> zufrieden, oder es ist eben friend.
Die Syntax hierzu lautet:
template <typename T, typename U>
friend class test;
und alle anderen test<> - Instanziierungen sind automatisch Freunde. Warum
geht das nicht? Sehr alter GCC? Das wäre nämlich die intuitivste Lösung,
auch für spätere Leser.
Thomas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Olaf Krzikalla Guest
|
Posted: Mon Apr 25, 2005 9:41 am Post subject: Re: Konvertierung zwischen Template-Instanziierungen |
|
|
Hi,
Bastian Blank wrote:
| Quote: | Ich habe ein Template, das ähnlich aufgebaut ist wie viele der
STL-Templates beim gcc:
| template <typename type, typename allocator
Jetzt möchte ich Objekte mit unterschiedlichen Allokatoren auseinander
konstruieren:
| test
| test<char, alloc2> t2 (t1);
Die beiden Typen sind nicht kompatibel.
Nee, aber Du kannst einen entsprechenden ctor anbieten: |
template <typename type, typename allocator>
class test
{
template<typename allocator2>
test (const test<type, allocator2>& src);
};
Obiger Konstruktor ist im übrigen gleichzeitig ein copy-ctor.
Hth
Olaf Krzikalla
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Bastian Blank Guest
|
Posted: Mon Apr 25, 2005 4:23 pm Post subject: Re: Konvertierung zwischen Template-Instanziierungen |
|
|
Thomas Mang wrote:
| Quote: | template
friend class test;
|
Hmm, irgendwie war ich der Ansicht, dass das so nicht geht.
Partiell spezialisierte Templates als friend geht zumindest nicht.
| Quote: | Warum
geht das nicht?
|
Ich war mir sicher, das es nicht geht, tut trotzdem, danke.
| Quote: | Sehr alter GCC? Das wäre nämlich die intuitivste Lösung,
auch für spätere Leser.
|
Hier: 4.0, das sollte reichen.
Bastian
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Mang Guest
|
Posted: Tue Apr 26, 2005 5:23 am Post subject: Re: Konvertierung zwischen Template-Instanziierungen |
|
|
"Olaf Krzikalla" <krzikalla (AT) gmx (DOT) net> schrieb im Newsbeitrag
news:426cbc55$0$79458$14726298 (AT) news (DOT) sunsite.dk...
| Quote: | Hi,
Bastian Blank wrote:
Ich habe ein Template, das ähnlich aufgebaut ist wie viele der
STL-Templates beim gcc:
| template <typename type, typename allocator
Jetzt möchte ich Objekte mit unterschiedlichen Allokatoren auseinander
konstruieren:
| test
| test<char, alloc2> t2 (t1);
Die beiden Typen sind nicht kompatibel.
Nee, aber Du kannst einen entsprechenden ctor anbieten:
template <typename type, typename allocator
class test
{
template
test (const test
};
Obiger Konstruktor ist im übrigen gleichzeitig ein copy-ctor.
|
Nein, ist er nicht, da er ein template ist. Der ist ein ganz normaler
Konstruktor, und der Compiler wird einen copy-constructor automatisch für
Dich generieren, der dann beim Kopieren (im C++ - Sinne) aufgerufen wird.
Das ist besonders wichtig falls man glaubt so ein "copy-constructor" wie
oben irgendwelche Aktionen erledigt , die der compiler-generierte nicht
macht (z.b. Ressourcen freigeben, dann gibts nämlich ein Leck).
Thomas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Olaf Krzikalla Guest
|
Posted: Tue Apr 26, 2005 5:02 pm Post subject: Re: Konvertierung zwischen Template-Instanziierungen |
|
|
Hi,
Thomas Mang wrote:
| Quote: | Nein, ist er nicht, da er ein template ist.
*lol* |
Kannst Du mir das nicht ein paar Stunden eher sagen? Bin heute früh
genau damit auf die Fresse geflogen.
Ciao Olaf
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|