 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Markus Moll Guest
|
Posted: Fri May 11, 2007 12:54 am Post subject: Problem mit template-default-Argumenten |
|
|
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
|
Posted: Fri May 11, 2007 11:51 am Post subject: Re: Problem mit template-default-Argumenten |
|
|
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
|
Posted: Fri May 11, 2007 11:52 am Post subject: Re: Problem mit template-default-Argumenten |
|
|
Markus Moll wrote:
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
|
Posted: Fri May 11, 2007 2:15 pm Post subject: Re: Problem mit template-default-Argumenten |
|
|
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
|
Posted: Fri May 11, 2007 5:12 pm Post subject: Re: Problem mit template-default-Argumenten |
|
|
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
|
Posted: Fri May 11, 2007 6:24 pm Post subject: Re: Problem mit template-default-Argumenten |
|
|
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
|
Posted: Fri May 11, 2007 9:10 pm Post subject: Danke (was: Problem mit template-default-Argumenten) |
|
|
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
|
|
| 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
|
|