 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Rolf Magnus Guest
|
Posted: Tue Nov 04, 2003 12:33 pm Post subject: Problem mit mem_fun und bind2nd |
|
|
Folgendes so weit wie möglich vereinfachte Programm:
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
struct X
{
const char* name() const { return "Rolf"; }
};
struct Y
{
void hallo(const X& x)
{
std::cout << "Hallo Welt, hier " << x.name() << 'n';
}
};
int main()
{
std::vector
X x;
std::for_each(v.begin(), v.end(),
std::bind2nd(std::mem_fun(&Y::hallo), x)); // Zeile 25
}
bringt bei meinem g++ 3.3 folgende Fehlermeldung:
/opt/gcc/include/c++/3.3/bits/stl_function.h: In instantiation of
`std::binder2nd<std::mem_fun1_t':
mem_fun.cpp:25: instantiated from here
/opt/gcc/include/c++/3.3/bits/stl_function.h:393: error: forming
reference to
reference type `const X&'
/opt/gcc/include/c++/3.3/bits/stl_function.h: In function `
std::binder2nd<_Operation> std::bind2nd(const _Operation&, const
_Tp&) [with
_Operation = std::mem_fun1_t<void, Y, const X&>, _Tp = X]':
mem_fun.cpp:25: instantiated from here
/opt/gcc/include/c++/3.3/bits/stl_function.h:413: error: no matching
function
for call to `std::binder2nd<std::mem_fun1_t
| Quote: | ::binder2nd(
const std::mem_fun1_t<void, Y, const X&>&, const X&)' |
/opt/gcc/include/c++/3.3/bits/stl_function.h:386: error: candidates are:
std::binder2nd<std::mem_fun1_t::binder2nd(const
std::binder2nd<std::mem_fun1_t&)
Comeau online meldet ähnliches, also wird's wohl an meinem Code liegen.
Wenn ich Y::hallo() ändere in:
void hallo(X x)
funktioniert alles. Wieso darf ich hier als Parameter keine Referenz
verwenden?
--
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 |
|
 |
Markus Breuer Guest
|
Posted: Tue Nov 04, 2003 1:39 pm Post subject: Re: Problem mit mem_fun und bind2nd |
|
|
Rolf Magnus schrieb:
| Quote: | Folgendes so weit wie möglich vereinfachte Programm:
#include <iostream
#include
#include
#include
struct X
{
const char* name() const { return "Rolf"; }
};
struct Y
{
void hallo(const X& x)
{
std::cout << "Hallo Welt, hier " << x.name() << 'n';
}
};
int main()
{
std::vector
X x;
std::for_each(v.begin(), v.end(),
std::bind2nd(std::mem_fun(&Y::hallo), x)); // Zeile 25
}
bringt bei meinem g++ 3.3 folgende Fehlermeldung:
/opt/gcc/include/c++/3.3/bits/stl_function.h: In instantiation of
`std::binder2nd<std::mem_fun1_t':
mem_fun.cpp:25: instantiated from here
/opt/gcc/include/c++/3.3/bits/stl_function.h:393: error: forming
reference to
reference type `const X&'
/opt/gcc/include/c++/3.3/bits/stl_function.h: In function `
std::binder2nd<_Operation> std::bind2nd(const _Operation&, const
_Tp&) [with
_Operation = std::mem_fun1_t<void, Y, const X&>, _Tp = X]':
mem_fun.cpp:25: instantiated from here
/opt/gcc/include/c++/3.3/bits/stl_function.h:413: error: no matching
function
for call to `std::binder2nd<std::mem_fun1_t
::binder2nd(
const std::mem_fun1_t
/opt/gcc/include/c++/3.3/bits/stl_function.h:386: error: candidates are:
std::binder2nd<std::mem_fun1_t::binder2nd(const
std::binder2nd<std::mem_fun1_t&)
Comeau online meldet ähnliches, also wird's wohl an meinem Code liegen.
Wenn ich Y::hallo() ändere in:
void hallo(X x)
funktioniert alles. Wieso darf ich hier als Parameter keine Referenz
verwenden?
|
Wenn ich die Fehlermeldung deines Compiler richtig verstehe, ist das
Probleme wie folgt:
typedef ... TYPE;
typedef const TYPE CONST_TYPE;
CONST_TYPE meine_variable;
template<class T>
class mem_fun_t {
const T& xyz;
};
Mit T = CONST_TYPE ergibt sich dadurch folgendes:
const DeinTyp && xyz; // !!!
Die Referenz auf eine Referenz ist nicht zulässig. Vermutlich ist das
auch der Grund, warum STL-Container keine Referenzen beinhalten dürfen )
Gruß Markus
--
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 |
|
 |
Daniel Albuschat Guest
|
Posted: Tue Nov 04, 2003 2:53 pm Post subject: Re: Problem mit mem_fun und bind2nd |
|
|
Rolf Magnus wrote:
| Quote: | Folgendes so weit wie möglich vereinfachte Programm:
[snip]
funktioniert alles. Wieso darf ich hier als Parameter keine Referenz
verwenden?
|
Weil der ctor von binder2nd als zweiten Parameter eine Referenz auf
den Typ des Parameters nimmt. Da ich meine Programme mit Vim compiliere,
und der mich haendchenhaltend zur Fehlerquelle fuehrt, hab' ich
zwangslaeufig einen Blick in den g++ STL Source geworfen, wo denn
steht:
template<class _Operation>
class binder2nd: public unary_function<typename
_Operation::first_argument_type,
typename _Operator::result_type> {
public:
binder2nd(const _Operation & __x, // v-- !!!
const typename _Operation::second_argument_type &__y):
op(__x), value(__y) {}
// etc
};
Wodurch klar ist, dass _Operation::second_argument_type & ein X && sein
wird.
Eine Loesung waere, einen Pointer statt eine Referenz zu nutzen, oder,
wenn moeglich, zu kopieren (was evtl. vom compiler wegoptimiert werden
koennte).
cu,
Daniel Albuschat
--
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: Tue Nov 04, 2003 3:48 pm Post subject: Re: Problem mit mem_fun und bind2nd |
|
|
Daniel Albuschat wrote:
| Quote: | Rolf Magnus wrote:
Folgendes so weit wie möglich vereinfachte Programm:
[snip]
funktioniert alles. Wieso darf ich hier als Parameter keine Referenz
verwenden?
Weil der ctor von binder2nd als zweiten Parameter eine Referenz auf
den Typ des Parameters nimmt. Da ich meine Programme mit Vim
compiliere,
|
Ich verwende auch vim (es gibt nichts besseres!), aber meine selbst
compilierte Version bleibt aus unerfindlichen Gründen einfach für immer
stehen, wenn sie einen anderern Prozess (wie z.B. make) starten
soll, ...
| Quote: | und der mich haendchenhaltend zur Fehlerquelle fuehrt,
|
.... deshalb hab ich es im Moment nicht so komfortabel wie du :-(
| Quote: | hab' ich zwangslaeufig einen Blick in den g++ STL Source geworfen, wo
denn steht:
template<class _Operation
class binder2nd: public unary_function
_Operation::first_argument_type,
typename _Operator::result_type> {
public:
binder2nd(const _Operation & __x, // v--
!!!
const typename _Operation::second_argument_type
&__y):
op(__x), value(__y) {}
// etc
};
Wodurch klar ist, dass _Operation::second_argument_type & ein X &&
sein wird.
Eine Loesung waere, einen Pointer statt eine Referenz zu nutzen,
|
Ich hätte zwar lieber eine Referenz gehabt, aber ein Zeiger tut's zur
Not auch. Alternativ könnte ich auch wieder zur ursprünglichen Lösung
(eine gewöhnliche for-Schleife) zurückkehren. Die ist eh kaum länger
und hat mich weniger Zeit zum Schreiben gekostet. Solche Probleme habe
ich ständig mit den Standardalgorithmen. Geht das nur mir so oder ist
eine "konventionelle" Schleife wirklich in 90% der Fälle einfacher,
kürzer, übersichtlicher und/oder "kooperativer" als ein
Standardalgorithmus? Meist wälze ich eine halbe Stunde lang den
Stroustrup, um es dann irgendwann nach etlichen fehlgeschlagenen
Compile-Versuchen resigniert durch eine in einer Minute geschriebene
und auf den ersten Blick verständliche zwei-bis dreizeilige Schleife zu
ersetzen.
Irgendwie kann ich mich mit den Standardalgorithmen nicht anfreunden.
| Quote: | oder,
wenn moeglich, zu kopieren (was evtl. vom compiler wegoptimiert werden
koennte).
|
Darf er das denn überhaupt bei Parametern? Spielt in meinem Fall keine
Rolle, da die Klasse mit Absicht nicht kopierbar ist (und auch im
optimierten Fall der Kopierkonstruktor zumindest verfügbar sein müßte),
aber interssiert mich trotzdem.
--
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 |
|
 |
André Pönitz Guest
|
Posted: Tue Nov 04, 2003 3:58 pm Post subject: Re: Problem mit mem_fun und bind2nd |
|
|
Rolf Magnus <ramagnus (AT) t-online (DOT) de> wrote:
| Quote: | Geht das nur mir so
|
Noe ;-|
| Quote: | oder ist eine "konventionelle" Schleife wirklich in 90% der Fälle
einfacher, kürzer, übersichtlicher und/oder "kooperativer" als ein
Standardalgorithmus?
|
Ich ende auch fast immer bei Schleifen. Mit boost & lambda isses zwar
ein bisschen besser, aber "huebscher" wird's mit Algorithmen wirklich
selten.
Andre'
--
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
|
|