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 

Element-Templates

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





PostPosted: Mon Feb 26, 2007 5:58 pm    Post subject: Element-Templates Reply with quote



class Key {
public:
template <class T>
T get()
{}
template <class T>
void set(T x)
{}
};

Wie kann ich zu der Element-Template Methode get() und set(T x)
Spezialisierungen schreiben?

std::string s;
set(s);
funktioniert bereits, obwohl kein POD, ohne Spezialisierung, warum?

Der naive Ansatz
template <>
void Key::set<std::string>(std::string x)
{}

führt zu einer Mehrdeutigkeit bei set(std::string), warum wird nicht die
mehr spezialisierte Methode verwendet?

Will ich die Spezialisierung auch direkt als Element-Template schreiben,
bekomme ich den Fehler:
./include/key:51: error: explicit specialization in non-namespace
scope ?class kdb::Key?
../include/key:52: error: template-id ?set<std::string>? for ?void
kdb::set(std::string)? does not match any template declaration
../include/key:52: error: invalid function declaration

Auf Seite 371 von "Die C++ Programmiersprache" 4.te Deutsche Ausgabe sind
Element-Templates beschrieben. Es wird darauf hingewiesen, dass virtuelle
Element-Templates nicht unterstützt werden, allerdings kann ich nichts
betreffend Spezialisierungen finden. Wo wird detaillierter auf dieses Thema
eingegangen?

vielen Dank
mfg Markus

--
http://www.markus-raab.org | Die Klage über die Schärfe des
-o) | Wettbewerbes ist in Wirklichkeit meist nur
Kernel 2.6.18 /\ | eine Klage über den Mangel an Einfällen.
on a i686 _\_v | -- Walther Rathenau
Back to top
Thomas Maeder
Guest





PostPosted: Tue Feb 27, 2007 3:34 am    Post subject: Re: Element-Templates Reply with quote



Markus Raab <usenet@markus-raab.org> writes:

Quote:
class Key {
public:
template <class T
T get()
{}
template <class T
void set(T x)
{}
};

Wie kann ich zu der Element-Template Methode get() und set(T x)
Spezialisierungen schreiben?

Ich hab's mit XEmacs gemacht :-)

z.B.

template <>
int Key::get<int>()
{
}



Quote:
std::string s;
set(s);
funktioniert bereits, obwohl kein POD, ohne Spezialisierung, warum?

Muss ein Compilerfehler sein, wenn das im globalen Namensraum steht
und übersetzt wird.

Wenn nicht, schreibe uns bitte, poste bitte das minimale Programm, wo
das funktioniert.



Quote:
Der naive Ansatz
template
void Key::set<std::string>(std::string x)
{}

führt zu einer Mehrdeutigkeit bei set(std::string), warum wird nicht die
mehr spezialisierte Methode verwendet?

Für welches Programm?
Back to top
Markus Moll
Guest





PostPosted: Tue Feb 27, 2007 4:46 pm    Post subject: Re: Element-Templates Reply with quote



Hallo

Markus Raab wrote:
Quote:
class Key {
public:
template <class T
T get()
{}
template <class T
void set(T x)
{}
};

Wie kann ich zu der Element-Template Methode get() und set(T x)
Spezialisierungen schreiben?

std::string s;
set(s);
funktioniert bereits, obwohl kein POD, ohne Spezialisierung, warum?

Was hat das mit PODs zu tun?

Quote:
Der naive Ansatz
template
void Key::set<std::string>(std::string x)
{}

führt zu einer Mehrdeutigkeit bei set(std::string), warum wird nicht die
mehr spezialisierte Methode verwendet?

Das sollte schon gehen, außer... außer du hast bereits vor der
Deklaration der Spezialisierung set<std::string>() verwendet, so daß der
Compiler eine implizite Instantiierung vorgenommen hat (vornehmen mußte).

Quote:
Will ich die Spezialisierung auch direkt als Element-Template schreiben,
bekomme ich den Fehler:
./include/key:51: error: explicit specialization in non-namespace
scope ?class kdb::Key?

Stimmt, denn das geht nicht. Die Spezialisierung für member templates
muß im die enthaltende Klasse umfassenden Namespace geschehen.

Quote:
Auf Seite 371 von "Die C++ Programmiersprache" 4.te Deutsche Ausgabe sind
Element-Templates beschrieben. Es wird darauf hingewiesen, dass virtuelle
Element-Templates nicht unterstützt werden, allerdings kann ich nichts
betreffend Spezialisierungen finden. Wo wird detaillierter auf dieses Thema
eingegangen?

In TC++PL? Weiß ich gerade nicht, kann auch nicht nachsehen.

Markus
Back to top
Markus Raab
Guest





PostPosted: Wed Feb 28, 2007 11:00 pm    Post subject: Re: Element-Templates Reply with quote

Thomas Maeder wrote:
Quote:
Markus Raab <usenet@markus-raab.org> writes:

Wie kann ich zu der Element-Template Methode get() und set(T x)
Spezialisierungen schreiben?

template
int Key::get<int>()
{
}

Ok, danke.
Da wird noch etwas an meinen Übersetzungseinheiten happern, siehe unten.

Quote:
std::string s;
set(s);
funktioniert bereits, obwohl kein POD, ohne Spezialisierung, warum?

Muss ein Compilerfehler sein, wenn das im globalen Namensraum steht
und übersetzt wird.
Wenn nicht, schreibe uns bitte, poste bitte das minimale Programm, wo
das funktioniert.

#include <iostream>
#include <string>
#include <stdint.h>

class Key
{
public:
template <class T>
T get() {
T x; return x;
}

template <class T>
void set(T x) {
std::cout << x << std::endl;
}
};

void test_get ()
{
Key test;

test.set<int> (401);
test.get<int> ();

test.set<std::string> ("myoth");
test.get<std::string> ();
}

Hier funktioniert auch std::string.

Quote:
Der naive Ansatz
template
void Key::set<std::string>(std::string x)
{}

führt zu einer Mehrdeutigkeit bei set(std::string), warum wird nicht die
mehr spezialisierte Methode verwendet?

Für welches Programm?

Obiges Programm steht in key.h und wird zu einer library gelinkt.
Wenn man jetzt in einem anderen Programm key.h inkludiert und zusätzlich die
library dazulinken will, passiert natürlich:
test.cpp:(.text+0x72): multiple definition of `void
Key::set<std::basic_string<char, std::char_traits<char>,
std::allocator<char> > >(std::basic_string<char, std::char_traits<char>,
std::allocator<char> >)

Wie man das jetzt machen kann ist nur noch interessehalber. Die Lösung mit
stringstreams operatoren << und >> zu implementieren ist eleganter als die
Spezialisierungen.

mfg Markus

--
http://www.markus-raab.org | Walking on water and developing software
-o) | from a specification are easy
Kernel 2.6.18 /\ | - if both are frozen
on a i686 _\_v |
Back to top
Thomas Maeder
Guest





PostPosted: Thu Mar 01, 2007 4:18 am    Post subject: Re: Element-Templates Reply with quote

Markus Raab <usenet@markus-raab.org> writes:

Quote:
Muss ein Compilerfehler sein, wenn das im globalen Namensraum steht
und übersetzt wird.
Wenn nicht, schreibe uns bitte, poste bitte das minimale Programm, wo
das funktioniert.

#include <iostream
#include <string
#include <stdint.h

Wozu dieser Header?


Quote:
class Key
{
public:
template <class T
T get() {
T x; return x;
}

template <class T
void set(T x) {
std::cout << x << std::endl;
}
};

void test_get ()
{
Key test;

test.set<int> (401);
test.get<int> ();

test.set<std::string> ("myoth");
test.get<std::string> ();
}

Hier funktioniert auch std::string.

Ok.


Quote:
Der naive Ansatz
template
void Key::set<std::string>(std::string x)
{}

führt zu einer Mehrdeutigkeit bei set(std::string), warum wird
nicht die mehr spezialisierte Methode verwendet?

Meinst Du bei

test.set<std::string> ("myoth");

?


Quote:

Für welches Programm?

Obiges Programm steht in key.h und wird zu einer library gelinkt.
Wenn man jetzt in einem anderen Programm key.h inkludiert und zusätzlich die
library dazulinken will, passiert natürlich:
test.cpp:(.text+0x72): multiple definition of `void
Key::set<std::basic_string<char, std::char_traits<char>,
std::allocator<char> > >(std::basic_string<char, std::char_traits<char>,
std::allocator<char> >)

Du kannst natürlich die explizite Spezialisierung im Header
deklarieren und in einer Übersetzungseinheit definieren. So wie man's
mit anderen Funktionen auch macht.
Back to top
Markus Raab
Guest





PostPosted: Fri Mar 02, 2007 12:38 am    Post subject: Re: Element-Templates Reply with quote

Thomas Maeder wrote:

Quote:
Markus Raab <usenet@markus-raab.org> writes:

Muss ein Compilerfehler sein, wenn das im globalen Namensraum steht
und übersetzt wird.
Wenn nicht, schreibe uns bitte, poste bitte das minimale Programm, wo
das funktioniert.

#include <iostream
#include <string
#include <stdint.h

Wozu dieser Header?

Gehört nicht zum minimalen Programm.

Quote:
Der naive Ansatz
template
void Key::set<std::string>(std::string x)
{}

führt zu einer Mehrdeutigkeit bei set(std::string), warum wird
nicht die mehr spezialisierte Methode verwendet?

Meinst Du bei

test.set<std::string> ("myoth");

Da es ein Linker Fehler ist kann ich die Zeile nicht angeben ;)

Aber Key::set<std::basic_string...> ist schuld. Das ist in zwei
Übersetzungseinheiten definiert.

Quote:

Für welches Programm?

Obiges Programm steht in key.h und wird zu einer library gelinkt.
Wenn man jetzt in einem anderen Programm key.h inkludiert und zusätzlich
die library dazulinken will, passiert natürlich:
test.cpp:(.text+0x72): multiple definition of `void
Key::set<std::basic_string<char, std::char_traits<char>,
std::allocator<char> > >(std::basic_string<char, std::char_traits<char>,
std::allocator<char> >)

Du kannst natürlich die explizite Spezialisierung im Header
deklarieren und in einer Übersetzungseinheit definieren. So wie man's
mit anderen Funktionen auch macht.

Natürlich, vielen Dank für die Hilfe.

mfg Markus

--
http://www.markus-raab.org | Die Beleidigungen sind die Argumente jener,
-o) | die über keine Argumente verfügen. --
Kernel 2.6.18 /\ | J.J. Rousseau
on a i686 _\_v |
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.