 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Hans Peters Guest
|
Posted: Sun Oct 23, 2005 9:06 am Post subject: Ternary in Konstruktur |
|
|
Hallo Newsgroup,
ich frage mich, warum folgendes nicht funktioniert:
(habe grade keinen Übersetzer hier, deswegen aus dem Gedächtnis, hoffe,
daß ich nicht allzu viele Fehler einbaue, auch bitte ich eventuelle
Standard-Inkonformitäten zu entschuldigen)
---
#include <iostream>
#include <string>
#include <list>
using namespace std; // wg. faulheit
class foo {
public:
foo( string s ) {
cout<<"string"<
}
foo( list
cout<<"liste"<
}
};
int main( int argc, char **args ) {
string s;
list
foo bar = new foo( 1 == 1 ? s : l );
return 0;
}
---
g++ gibt mir beim Konstruktor den Fehler: "no match for ternary" oder so
ähnlich.
vc++ beschwert sich, daß die Konversion von String nach List (oder
andersrum) nicht gelingt.
(ich bin eigentlich durch Java auf das Problem gestoßen und wollte dann
ausprobieren, ob es in C++ funktioniert oder nicht)
Gehe ich recht in der Annahme, daß der "? :"-Operator sozusagen den
kleinsten gemeinsamen Nenner der beiden Typen sucht, und diesen dann
zurückliefert?
Ganz komisch wird das verhalten jedoch erst wenn ich das Programm
folgendermaßen abändere:
---
#include <iostream>
using namespace std; // wg. faulheit
class foo {
public:
foo( int n ) {
cout<<"int"<
}
foo( char c ) {
cout<<"char"<
}
};
int main( int argc, char **args ) {
foo bar = new foo( 1 == 1 ? 10 : 'a' );
return 0;
}
hier erwarte ich als Ausgabe "int" was auch zutrifft, wenn ich jedoch
den ersten Konstruktor von foo( int n ) in foo( int *n ) ändere, bekomme
ich als Ausgabe "char".
Danke für Aufklärung und Erleuchtung
Gruß
--
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 |
|
 |
Raymond Haeb Guest
|
Posted: Sun Oct 23, 2005 11:53 am Post subject: Re: Ternary in Konstruktur |
|
|
Es begab sich, daß Hans Peters der Welt verkündete:
| Quote: | foo( string s ) {
cout<<"string"<
}
foo( list
cout<<"liste"<
}
foo bar = new foo( 1 == 1 ? s : l );
|
Wie wäre es da ein 1==1?foo(s):foo(l) draus zu machen? Dann ist der Typ
auf jeden Fall foo und nicht mehr string oder list. Allerdings wirst Du dann
wohl auch einen Copycontructor brauchen.
Raymond
--
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 |
|
 |
Rolf Magnus Guest
|
Posted: Sun Oct 23, 2005 11:56 am Post subject: Re: Ternary in Konstruktur |
|
|
Hans Peters wrote:
| Quote: | #include <iostream
#include
#include
using namespace std; // wg. faulheit
class foo {
public:
foo( string s ) {
cout<<"string"<
}
foo( list
cout<<"liste"<
}
};
int main( int argc, char **args ) {
string s;
list
foo bar = new foo( 1 == 1 ? s : l );
return 0;
}
---
g++ gibt mir beim Konstruktor den Fehler: "no match for ternary" oder so
ähnlich.
vc++ beschwert sich, daß die Konversion von String nach List (oder
andersrum) nicht gelingt.
(ich bin eigentlich durch Java auf das Problem gestoßen und wollte dann
ausprobieren, ob es in C++ funktioniert oder nicht)
Gehe ich recht in der Annahme, daß der "? :"-Operator sozusagen den
kleinsten gemeinsamen Nenner der beiden Typen sucht, und diesen dann
zurückliefert?
|
Der Operator braucht für das zweite und dritte Argument denselben Typ, denn
dadurch bestimmt sich ja der Rückgabetyp, welcher ja fix ist und nicht vom
Ergebnis des Vergleichs abhängen kann.
Hier gelten natürlich die üblichen Regeln für Konvertierungen, so daß man
auch Werte verschiedener Typen angeben kann, wenn eine implizite
Konvertierung möglich ist.
| Quote: | Ganz komisch wird das verhalten jedoch erst wenn ich das Programm
folgendermaßen abändere:
---
#include
using namespace std; // wg. faulheit
class foo {
public:
foo( int n ) {
cout<<"int"<
}
foo( char c ) {
cout<<"char"<
}
};
int main( int argc, char **args ) {
foo bar = new foo( 1 == 1 ? 10 : 'a' );
return 0;
}
hier erwarte ich als Ausgabe "int" was auch zutrifft, wenn ich jedoch
den ersten Konstruktor von foo( int n ) in foo( int *n ) ändere, bekomme
ich als Ausgabe "char".
|
Was hättest du denn erwartet?
10 ist vom Typ int, 'a' ist vom Typ char. Dieser kann implizit in int
konvertiert werden, was dann auch passiert. Der Rückgabetyp für den
Operator ist also int. Deshalb wird der Konstruktor mit dem int-Parameter
aufgerufen. Wenn du dem Compiler den nimmst, bleibt ihm ja nur der mit char
übrig. Der Rückgabewert des operator?: wird also in einen char konvertiert
und der entsprechende Konstruktor von foo aufgerufen.
--
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 |
|
 |
kanze Guest
|
Posted: Mon Oct 24, 2005 9:53 am Post subject: Re: Ternary in Konstruktur |
|
|
Rolf Magnus wrote:
| Quote: | Hans Peters wrote:
#include <iostream
#include
#include
using namespace std; // wg. faulheit
class foo {
public:
foo( string s ) {
cout<<"string"<
}
foo( list
cout<<"liste"<
}
};
int main( int argc, char **args ) {
string s;
list
foo bar = new foo( 1 == 1 ? s : l );
return 0;
}
---
g++ gibt mir beim Konstruktor den Fehler: "no match for
ternary" oder so ähnlich.
vc++ beschwert sich, daß die Konversion von String nach List
(oder andersrum) nicht gelingt.
|
Hoffentlich meckern auch beide darum, dass du einen »foo« mit
einem »foo*« initialisieren versuchst. Der »new« ist hier
überflussig.
| Quote: | (ich bin eigentlich durch Java auf das Problem gestoßen und
wollte dann ausprobieren, ob es in C++ funktioniert oder
nicht)
|
In der Tat merkt man einen Einfluss von Java.
| Quote: | Gehe ich recht in der Annahme, daß der "? :"-Operator
sozusagen den kleinsten gemeinsamen Nenner der beiden Typen
sucht, und diesen dann zurückliefert?
Der Operator braucht für das zweite und dritte Argument
denselben Typ, denn dadurch bestimmt sich ja der Rückgabetyp,
welcher ja fix ist und nicht vom Ergebnis des Vergleichs
abhängen kann.
Hier gelten natürlich die üblichen Regeln für Konvertierungen,
so daß man auch Werte verschiedener Typen angeben kann, wenn
eine implizite Konvertierung möglich ist.
|
Klarer gesagt, angegeben A?B:C wird es versucht, B zum Typ von C
bzw. C zum Typ von B zu konvertieren. Ein »gemeinsamer Nenner«
wird aber nicht gesucht. Insbesonders: wenn B Typ Klasse1, und
C Typ Klasse2 hat, wo Klasse1 und Klasse2 beide von Basis
abgeleitet sind, wird nicht B und C in Basis umgewandelt.
| Quote: | Ganz komisch wird das verhalten jedoch erst wenn ich das Programm
folgendermaßen abändere:
---
#include
using namespace std; // wg. faulheit
class foo {
public:
foo( int n ) {
cout<<"int"<
}
foo( char c ) {
cout<<"char"<
}
};
int main( int argc, char **args ) {
foo bar = new foo( 1 == 1 ? 10 : 'a' );
return 0;
}
hier erwarte ich als Ausgabe "int" was auch zutrifft, wenn
ich jedoch den ersten Konstruktor von foo( int n ) in foo(
int *n ) ändere, bekomme ich als Ausgabe "char".
Was hättest du denn erwartet?
10 ist vom Typ int, 'a' ist vom Typ char. Dieser kann implizit
in int konvertiert werden, was dann auch passiert. Der
Rückgabetyp für den Operator ist also int. Deshalb wird der
Konstruktor mit dem int-Parameter aufgerufen. Wenn du dem
Compiler den nimmst, bleibt ihm ja nur der mit char übrig. Der
Rückgabewert des operator?: wird also in einen char
konvertiert und der entsprechende Konstruktor von foo
aufgerufen.
|
Immerhin frage ich mich, wie er das Ergebnis von new zur
Initialisierung einer foo benutzen kann. Der Compiler hätte
meckern sollen. (Auch sein Beispiel oben lässt sich bei mir
nicht kompilieren.)
--
James Kanze GABI Software
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
--
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
|
|