2012-04-10 1 views
0

Okay, ich bin neugierig, warum Gcc dies eine Zweideutigkeit nennt. check this:mehrere Vererbungsfehler

class base_stream 
{ 
public: 
    std::string m_buffer; 
}; 

class idatastream : public base_stream 
{ 

}; 

class odatastream : public base_stream 
{ 

}; 

class datastream : public idatastream, public odatastream 
{ 
public: 
    void dostuff(m_buffer = "some text";) // reference is ambiguous? 
}; 

i erklären m_buffer nur einmal in base_stream, und es nicht in den Vererbungsklassen neu deklarieren, also warum ist es, dass, wenn ich von den beiden Vererbungsklassen erben, m_buffer ist nicht eindeutig? der Fehler sagt dies:

||In member function 'void datastream::dostuff()':|
|22|error: reference to 'm_buffer' is ambiguous|
|6|error: candidates are: std::string base_stream::m_buffer|
|6|error: std::string base_stream::m_buffer|
||=== Build finished: 3 errors, 0 warnings ===|

ich verwirrt bin hier, weil die gültigen Kandidaten gleich sind. wenn ich die Defintion von dostuff zu ändern:

void dostuff() {base_stream::m_buffer = "test string";} 

, wie es schon sagt, bekomme ich diesen Fehler:

||In member function 'void datastream::dostuff()':|
|22|error: 'base_stream' is an ambiguous base of 'datastream'|
||=== Build finished: 1 errors, 0 warnings ===|

Dies ist, wo ich das Herz des Problems denken liegt. Kann ich nicht von zwei Klassen erben, die von derselben Klasse erben?

+4

Google "Diamant Problem C++". – cHao

+0

ha. Diamant. Ich verstehe es. Wenn Sie also jede der Klassen, die von der Basis erben, als virtuell markieren, bevor Sie sie mehrfach vererben, vermeiden Sie Mehrdeutigkeiten und stellen sicher, dass sie nur einmal vererbt werden. einfach und danke: P. – FatalCatharsis

+0

möglich Duplikat von [virtuelle Ableitung & Umwandlung mehrdeutig] (http://stackoverflow.com/questions/10093854/virtual-derivation-conversion-ambiguous) –

Antwort

1

Sie müssen idatastream und odatastream von base_stream mit virtueller Vererbung erben.

So etwas wie das könnte funktionieren.

class base_stream 
{ 
public: 
    std::string m_buffer; 
}; 

class idatastream : virtual public base_stream 
{ 

}; 

class odatastream : virtual public base_stream 
{ 

}; 

class datastream : public idatastream, public odatastream 
{ 
public: 
    void dostuff(m_buffer = "some text";) // reference is ambiguous? 
}; 

Also in diesem Fall nur eine Kopie von base_stream wird innerhalb data_stream existieren, die es möglich macht, m_buffer in data_stream zuzugreifen.

Ich hoffe, ich habe Ihre Frage beantwortet.

+0

yup, lesen Sie gerade über das Diamantproblem wie chao vorgeschlagen. wusste nicht, dass es hieß: \. Wie auch immer, froh, dass C++ Funktionalität speziell für diesen Zweck bietet: P – FatalCatharsis

Verwandte Themen