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 

Mehrdeutigkeit bei Mehrfachvererbung trotz unterschiedlicher

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





PostPosted: Thu Mar 22, 2007 2:50 pm    Post subject: Mehrdeutigkeit bei Mehrfachvererbung trotz unterschiedlicher Reply with quote



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





PostPosted: Thu Mar 22, 2007 7:39 pm    Post subject: Re: Mehrdeutigkeit bei Mehrfachvererbung trotz unterschiedli Reply with quote



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





PostPosted: Thu Mar 22, 2007 9:44 pm    Post subject: Re: Mehrdeutigkeit bei Mehrfachvererbung trotz unterschiedli Reply with quote



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