C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Konvertierung zwischen Template-Instanziierungen

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Bastian Blank
Guest





PostPosted: Sun Apr 24, 2005 11:14 am    Post subject: Konvertierung zwischen Template-Instanziierungen Reply with quote



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





PostPosted: Sun Apr 24, 2005 12:03 pm    Post subject: Re: Konvertierung zwischen Template-Instanziierungen Reply with quote



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





PostPosted: Sun Apr 24, 2005 9:10 pm    Post subject: Re: Konvertierung zwischen Template-Instanziierungen Reply with quote




"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





PostPosted: Mon Apr 25, 2005 9:41 am    Post subject: Re: Konvertierung zwischen Template-Instanziierungen Reply with quote

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





PostPosted: Mon Apr 25, 2005 4:23 pm    Post subject: Re: Konvertierung zwischen Template-Instanziierungen Reply with quote

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





PostPosted: Tue Apr 26, 2005 5:23 am    Post subject: Re: Konvertierung zwischen Template-Instanziierungen Reply with quote


"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





PostPosted: Tue Apr 26, 2005 5:02 pm    Post subject: Re: Konvertierung zwischen Template-Instanziierungen Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.