 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Maxim Guest
|
Posted: Thu Mar 22, 2007 2:50 pm Post subject: Mehrdeutigkeit bei Mehrfachvererbung trotz unterschiedlicher |
|
|
Hallo,
gegeben sei folgender Quelltext:
--
#include <iostream>
#include <string>
class Object
{
};
class MessageMetaInfo
{
};
class ObjectWriter
{
public:
virtual void write( std::ostream& stream, const std::string& name,
const Object& object, const char* context ) const=0;
};
class ElementWriter : public ObjectWriter
{
public:
virtual void write( std::ostream& stream, const std::string& name,
const Object& object, const char* context ) const
{
}
};
class MessageWriter
{
public:
virtual void write( std::ostream& stream, const MessageMetaInfo&
messageMetaInfo ) const
{
}
};
class SpecializedWriter : public MessageWriter, public ElementWriter
{
};
int main(int argc, char* argv[])
{
MessageMetaInfo mmi;
Object o;
SpecializedWriter w;
w.write( std::cout, "test", o, "context"); // HIER
w.write( std::cout, mmi ); // HIER
return 0;
}
Leider kann der Compiler trotz unterschiedlicher Parameterlisten nicht
zwischen den beiden Varianten der write Methode unterscheiden und
meldet an den "HIER" markierten stellen eine Mehrdeutigkeit.
Warum muss das so sein (d.h. wo stehts im Regelwerk)?
Aufzulösen wohl durch manuelles überschreiben beider Methoden in
"SpecializedWriter".
Grüße,
Maxim |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Thu Mar 22, 2007 7:39 pm Post subject: Re: Mehrdeutigkeit bei Mehrfachvererbung trotz unterschiedli |
|
|
On Mar 22, 10:50 am, "Maxim" <maximil...@hrabowski.net> wrote:
| Quote: | gegeben sei folgender Quelltext:
--
#include <iostream
#include <string
class Object
{};
class MessageMetaInfo
{};
class ObjectWriter
{
public:
virtual void write( std::ostream& stream, const std::string& name,
const Object& object, const char* context ) const=0;
};
class ElementWriter : public ObjectWriter
{
public:
virtual void write( std::ostream& stream, const std::string& name,
const Object& object, const char* context ) const
{
}
};
class MessageWriter
{
public:
virtual void write( std::ostream& stream, const MessageMetaInfo&
messageMetaInfo ) const
{
}
};
class SpecializedWriter : public MessageWriter, public ElementWriter
{
};
int main(int argc, char* argv[])
{
MessageMetaInfo mmi;
Object o;
SpecializedWriter w;
w.write( std::cout, "test", o, "context"); // HIER
w.write( std::cout, mmi ); // HIER
return 0;
}
Leider kann der Compiler trotz unterschiedlicher Parameterlisten nicht
zwischen den beiden Varianten der write Methode unterscheiden und
meldet an den "HIER" markierten stellen eine Mehrdeutigkeit.
Warum muss das so sein (d.h. wo stehts im Regelwerk)?
|
Weil die Ambiguität tritt schon beim Name-Binding auf, bevor die
Auflösung von überladenen Funktionen anfängt, siehe
10.2.
| Quote: | Aufzulösen wohl durch manuelles überschreiben beider Methoden in
"SpecializedWriter".
|
Weil dann der Compiler beide Namen in derselben Scope findet.
Normallerweise findet sich die Auflösung von überladenen
Funktionen nur innerhalb derselben Scope. Es gibt Ausnahmen, wo
ADL eintritt, das trifft aber nur Namen in Namespace-Scope.
--
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 |
|
 |
Stefan Reuther Guest
|
Posted: Thu Mar 22, 2007 9:44 pm Post subject: Re: Mehrdeutigkeit bei Mehrfachvererbung trotz unterschiedli |
|
|
Maxim wrote:
| Quote: | class SpecializedWriter : public MessageWriter, public ElementWriter { };
[...]
SpecializedWriter w;
w.write( std::cout, "test", o, "context"); // HIER
w.write( std::cout, mmi ); // HIER
Leider kann der Compiler trotz unterschiedlicher Parameterlisten nicht
zwischen den beiden Varianten der write Methode unterscheiden und
meldet an den "HIER" markierten stellen eine Mehrdeutigkeit.
Warum muss das so sein (d.h. wo stehts im Regelwerk)?
|
Der Compiler sucht zuerst nach Methoden mit dem Namen write. Dabei wird
er in MessageWriter und ElementWriter fündig, und kann sich nicht
entscheiden, an welcher Stelle er weitersuchen soll. Erst, wenn er die
passende Klasse identifiziert hat, würde er anfangen, Parameterlisten zu
vergleichen.
| Quote: | Aufzulösen wohl durch manuelles überschreiben beider Methoden in
"SpecializedWriter".
|
Oder besser durch using-Deklarationen.
class SpecializedWriter : public MessageWriter, public ElementWriter
{
public:
using MessageWriter::write;
using ElementWriter::write;
};
Ein ähnlich gelagertes Problem wird in der FAQ beschrieben:
<http://titanos.de/iso-c++/cpp%3Aname_hiding>.
Stefan |
|
| 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
|
|