Initialisierungsliste keine direkte Basis von



  • Hallo c++ Community. Ich habe eine Frage bezüglich einer Fehlermeldung in einem C++ Programm, welches ich vergeblich versuche zu kompilieren. Es stammt nicht von mir, soviel sei angemerkt 😉 sollte aber dennoch richtig sein.

    und zwar habe ich eine MyString.h datei mit den konstruktoren:

    MyString(const char* s = "");
    	MyString(const MyString&);
    

    wenn ich nun versuche die MyString.cpp zu kompilieren, dann gibt es eine Fehlermeldung:

    MyString.cpp:31:3: Fehler: Typ »MyString« ist keine direkte Basis von »MyString«

    und zwar an dieser Stelle:

    MyString::MyString(const MyString& s)
    : MyString(s.str)
    {}
    

    Desweiteren habe ich eine MyStringTest.cpp Klasse, in der ich eine main methode habe, wo ich einige konstruktor und funktionsaufrufe mache. Meines Wissens ist es auch nicht nötig die MyString.cpp zu kompilieren, wenn ich die Mystring.h in MyStringTest.cpp include oder?

    Ich bin nur auf diesen Fehler gestoßen, weil das MyStringTest.cpp Programm auch nicht kompiliert:

    #include <iostream>
    #include "MyString.h"
    
    using namespace std;
    
    void f(MyString &s) {
    	s.length();
    }
    void fc(const MyString &s) {
    	s.length();
    }
    
    int main() {
    	MyString a, b("welt");
    	MyString c(b);
    
    	a = "hallo";
    	cout << a << ", " << b << endl;
    
    	c = a + " ";
    	c += b;
    	cout << c << endl;
    
    	c = a + "123";
    	if (c != "123") {
    		cout << "String ungleich '123'" << endl;
    	}
    
    	f(c);
    	fc(c);
    
    	cout << "Anzahl MyString: " << MyString::getCount() << endl;
    
    	return 0;
    }
    

    da kommen dann unter anderem Fehlermeldungen wie: MyStringTest.cpp:(.text+0x14): undefined reference to `MyString::length()'

    obwohl die length methode auch in der MyString.h datei deklariert und in MyString.cpp definiert ist.

    Kann mir jemand helfen oder hinweise geben, was ich falsch mache?
    Vllt ist meine Titelbeschreibung auch nicht unbedingt die richtige, aber mir ist keine passende Beschreibung eingefallen
    Gruß Steve



  • steve123 schrieb:

    MyString(const char* s = "");
    	MyString(const MyString&);
    

    [...]

    MyString::MyString(const MyString& s)
    : MyString(s.str)
    {}
    

    Das ist ein delegierender Konstruktor. den gibt's erst mit C++11 Unterstützung des Compilers.

    steve123 schrieb:

    Meines Wissens ist es auch nicht nötig die MyString.cpp zu kompilieren, wenn ich die Mystring.h in MyStringTest.cpp include oder?

    Doch MyString.cpp kompilieren und das Kompilat anschließend dazulinken.



  • Vielen Dank für die schnelle Antwort.

    Ich hab die MyString.cpp jetzt mal mit g++ -std=c++0x -Wall -o "%e" "%f" in Geany kompiliert. Aber er gibt mir trotzdem immer noch den Fehler aus.



  • steve123 schrieb:

    Ich hab die MyString.cpp jetzt mal mit g++ -std=c++0x -Wall -o "%e" "%f" in Geany kompiliert. Aber er gibt mir trotzdem immer noch den Fehler aus.

    Welcher GCC ist das?
    delegating constructors werden erst ab GCC 4.7 unterstützt.



  • Terminal gcc -v zeigt das an:

    gcc version 4.8.1 (Ubuntu 4.8.1-2ubuntu1~12.04)

    mein ubuntu software center sagt aber: 4.6 ist installiert
    Weil ich für Vektoren mindestens 4.7 brauchte , habe ich es über http://askubuntu.com/questions/271388/how-to-install-gcc-4-8-in-ubuntu-12-04-from-the-terminal auf 4.8 geupdatet . Seitdem klappten die Vektoren zumindest.



  • versuchs mal statt mit

    -std=c++0x

    mit

    -std=c++11

    und mit gcc 4.8.1 im c++11 modus funktioniert es:
    https://ideone.com/OMCn6T



  • da kommt dann cc1plus: Fehler: nicht erkannte Kommandozeilenoption »-std=c++11«

    ich habe dein Test beispiel auch mal ausgeführt, da kam auch: test.cpp:6:14: Fehler: Typ »Test« ist keine direkte Basis von »Test«


  • Mod

    steve123 schrieb:

    da kommt dann cc1plus: Fehler: nicht erkannte Kommandozeilenoption »-std=c++11«

    Hast du es irgendwie geschafft, dass das g++ Frontend auf eine andere Version des Compilers verweist? Was gibt g++ -v ?



  • Ich habs jetzt nochmal überprüft, irgendwie hab ich anscheinend 2 Versionen drauf.

    Wenn ich gcc -v eingebe kommt: 4.8....
    wenn ich g++ -v eingebe kommt : gcc-Version 4.6.4 (Ubuntu/Linaro 4.6.4-1ubuntu1~12.04)

    daran wirds also liegen.
    Leider ist das g++ Paket in der aktuellen Version nur auf 4.6 -.-
    Ich finde auch nirgendwo ein passendes Update für Ubuntu 12.04 auf 4.8, gibt es da irgendwo Repositories?



  • Ich habe es jetzt mit diesem Tutorial: http://ubuntuhandbook.org/index.php/2013/08/install-gcc-4-8-via-ppa-in-ubuntu-12-04-13-04/
    hinbekommen, meinen g++ auf 4.8 zu bringen.
    Das kompilieren funktioniert jetzt.
    Vielen Dank für die Antworten und den Hinweis!!

    Gruß Steve


Log in to reply