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 

Problem mit template-default-Argumenten

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





PostPosted: Fri May 11, 2007 12:54 am    Post subject: Problem mit template-default-Argumenten Reply with quote



Hallo zusammen,

ich bin heute auf einen recht merkwürdigen Fehler gestoßen, den ich nicht
verstehe. (Könnte ein Bug im Compiler sein, muß aber sicher nicht)

sh$ cat t.cc
template<typename T, unsigned N> struct X {};
struct Y
{
Y(const X<double, 21>& x = X<double, 21>());
};

Ich sehe nichts, aber von mir probierte Compiler meinen:

sh$ g++ --version
g++ (GCC) 4.1.1
[...]
sh$ g++ -c t.cc
t.cc:4: error: expected identifier before numeric constant
t.cc:4: error: expected ',' or '...' before numeric constant
t.cc:4: error: wrong number of template arguments (1, should be 2)
t.cc:1: error: provided for 'template<class T, unsigned int N> struct X'
t.cc:4: error: default argument missing for parameter 2 of 'Y::Y(const
X<double, 21u>&, int)'
sh$ CC -V
CC: Sun WorkShop 6 update 2 C++ 5.3 Patch 111685-20 2004/03/19
sh$ CC t.cc
"t.cc", line 4: Error: ")" expected instead of "21".
1 Error(s) detected.

Dem Sun-Compiler traue ich wenig, GCC schon eher; aber Comeau online
beschwert sich überhaupt nicht und kompiliert anstandslos.

Anregungen?

Markus
Back to top
Guest






PostPosted: Fri May 11, 2007 11:51 am    Post subject: Re: Problem mit template-default-Argumenten Reply with quote



On May 10, 9:54 pm, Markus Moll <m...@rbg.informatik.tu-darmstadt.de>
wrote:
Quote:
Hallo zusammen,

ich bin heute auf einen recht merkwürdigen Fehler gestoßen, den ich nicht
verstehe. (Könnte ein Bug im Compiler sein, muß aber sicher nicht)

sh$ cat t.cc
template<typename T, unsigned N> struct X {};
struct Y
{
Y(const X<double, 21>& x = X<double, 21>());
};

Ich sehe nichts

Ja, da sieht mE alles ok aus.

Quote:
sh$ g++ --version
g++ (GCC) 4.1.1
[...]
sh$ g++ -c t.cc
t.cc:4: error: expected identifier before numeric constant
t.cc:4: error: expected ',' or '...' before numeric constant
t.cc:4: error: wrong number of template arguments (1, should be 2)
t.cc:1: error: provided for 'template<class T, unsigned int N> struct X'
t.cc:4: error: default argument missing for parameter 2 of 'Y::Y(const
X<double, 21u>&, int)'

Probier mal, das Argument per Value zu übergeben (Du bindest hier ja
ein Temporary an eine const Referenz), ein static_cast<unsigned>(21)
hinzuzufügen, etc...

Manchmal kommen dann Compiler damit zurecht.

Hm, bisher schien der gcc 4 ganz gut in diesen Dingen...

Ali
Back to top
Torsten Robitzki
Guest





PostPosted: Fri May 11, 2007 11:52 am    Post subject: Re: Problem mit template-default-Argumenten Reply with quote



Markus Moll wrote:


Quote:
Anregungen?

Vielleicht wäre es möglich eine Konstante anzulegen und auf die zu
verweisen oder den Parameter mit einem Funktionsaufruf zu initialisieren.

template<typename T, unsigned N> struct X {};

extern X<double, 21> const_x;
X<double, 21> func_x();

struct Y
{
Y(const X<double, 21>& x = const_x);
// oder
Y(const X<double, 21>& x = func_x());
};

mfg Torsten
Back to top
Christoph Rabel
Guest





PostPosted: Fri May 11, 2007 2:15 pm    Post subject: Re: Problem mit template-default-Argumenten Reply with quote

Markus Moll wrote:

Quote:


ich bin heute auf einen recht merkwürdigen Fehler gestoßen, den ich nicht

verstehe. (Könnte ein Bug im Compiler sein, muß aber sicher nicht)



sh$ cat t.cc

template<typename T, unsigned N> struct X {};

struct Y

{

Y(const X<double, 21>& x = X<double, 21>());

};



Ich sehe nichts, aber von mir probierte Compiler meinen:



Hi!



Schaut für mich auch korrekt aus. Habs mit Visual C++ probiert und das

schluckt den Code auch ohne weiteres...



Vielleicht als Workaround so folgendes?



template<typename T, unsigned N> struct X {};

struct Y

{

static X<double, 21> xx;

Y(const X<double, 21>& x = xx);

};

static X<double, 21> xx = X<double, 21>();



mfg



Christoph
Back to top
Guest






PostPosted: Fri May 11, 2007 5:12 pm    Post subject: Re: Problem mit template-default-Argumenten Reply with quote

On May 10, 9:54 pm, Markus Moll <m...@rbg.informatik.tu-darmstadt.de>
wrote:
Quote:
Hallo zusammen,

ich bin heute auf einen recht merkwürdigen Fehler gestoßen, den ich nicht
verstehe. (Könnte ein Bug im Compiler sein, muß aber sicher nicht)

sh$ cat t.cc
template<typename T, unsigned N> struct X {};
struct Y
{
Y(const X<double, 21>& x = X<double, 21>());
};

Ich sehe nichts, aber von mir probierte Compiler meinen:

sh$ g++ --version
g++ (GCC) 4.1.1
[...]
sh$ g++ -c t.cc
t.cc:4: error: expected identifier before numeric constant
t.cc:4: error: expected ',' or '...' before numeric constant
t.cc:4: error: wrong number of template arguments (1, should be 2)
t.cc:1: error: provided for 'template<class T, unsigned int N> struct X'
t.cc:4: error: default argument missing for parameter 2 of 'Y::Y(const
X<double, 21u>&, int)'
sh$ CC -V
CC: Sun WorkShop 6 update 2 C++ 5.3 Patch 111685-20 2004/03/19
sh$ CC t.cc
"t.cc", line 4: Error: ")" expected instead of "21".
1 Error(s) detected.

Dem Sun-Compiler traue ich wenig, GCC schon eher; aber Comeau online
beschwert sich überhaupt nicht und kompiliert anstandslos.

Anregungen?

Markus
Ich glaube, Comeau hat recht. G++ ist nur ein wenig durcheinander,

aber mit
einer kleinen Hilfestellung schafft der Gcc (4.2) es auch:


template<typename T, unsigned N> struct X {};
struct Y
{
typedef X<double, 21> derTyp;
Y(const derTyp& x = derTyp());
};

Uli
Back to top
James Kanze
Guest





PostPosted: Fri May 11, 2007 6:24 pm    Post subject: Re: Problem mit template-default-Argumenten Reply with quote

On May 10, 9:54 pm, Markus Moll <m...@rbg.informatik.tu-darmstadt.de>
wrote:

Quote:
ich bin heute auf einen recht merkwürdigen Fehler gestoßen, den ich nicht
verstehe. (Könnte ein Bug im Compiler sein, muß aber sicher nicht)

sh$ cat t.cc
template<typename T, unsigned N> struct X {};
struct Y
{
Y(const X<double, 21>& x = X<double, 21>());
};

Ich sehe nichts, aber von mir probierte Compiler meinen:

sh$ g++ --version
g++ (GCC) 4.1.1
[...]
sh$ g++ -c t.cc
t.cc:4: error: expected identifier before numeric constant
t.cc:4: error: expected ',' or '...' before numeric constant
t.cc:4: error: wrong number of template arguments (1, should be 2)
t.cc:1: error: provided for 'template<class T, unsigned int N> struct X'
t.cc:4: error: default argument missing for parameter 2 of 'Y::Y(const
X<double, 21u>&, int)'
sh$ CC -V
CC: Sun WorkShop 6 update 2 C++ 5.3 Patch 111685-20 2004/03/19
sh$ CC t.cc
"t.cc", line 4: Error: ")" expected instead of "21".
1 Error(s) detected.

Dem Sun-Compiler traue ich wenig, GCC schon eher; aber Comeau online
beschwert sich überhaupt nicht und kompiliert anstandslos.

Ich sehe auch keinen Fehler. Dazu: es kompiliert anstandslos
auch mit Sun CC 5.8 und mit VC++. (Sun CC 5.3 ist ziemlich alt;
du hast recht, ihn mit Templates nicht zu vertrauen:-).) Also
denke ich ehe an einen Fehler in g++.

--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
Markus Moll
Guest





PostPosted: Fri May 11, 2007 9:10 pm    Post subject: Danke (was: Problem mit template-default-Argumenten) Reply with quote

Hallo und danke an alle,

es war mir durchaus bewußt, daß es work-arounds gibt, ich wollte aber
gerade wissen, ob ich irgendeine Feinheit übersehen habe oder ob das
tatsächlich ein Bug im Compiler ist. Da der Fehler mit GCC 3.4, 4.0, 4.1
und 4.2 auftritt, werde ich wohl mal einen Bug-Report submitten.

Markus
Back to top
Markus Moll
Guest





PostPosted: Fri May 11, 2007 10:06 pm    Post subject: Lange bekannt (was: Problem mit template-default-Argumenten) Reply with quote

Hallo

ich schrieb:
Quote:
sh$ cat t.cc
template<typename T, unsigned N> struct X {};
struct Y
{
Y(const X<double, 21>& x = X<double, 21>());
};


Da konnte ich mich wohl gerade noch einmal davor bewahren, den x-ten
"duplicate"-Bug-Report einzusenden. Das Konstrukt ist wohl doch nicht
zulässig:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57
http://www.open-std.org/JTC1/sc22/wg21/docs/cwg_active.html#325

Markus
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.