[solved] cannot convert 'main():Blah*' to 'Blah*' for argu..

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
kalsan

[solved] cannot convert 'main():Blah*' to 'Blah*' for argu..

Beitrag von kalsan »

Hallo allerseits!
Ich habe eine struct Blah, die in main() deklariert ist. Des weiteren definiere ich oberhalb von main() eine Funktion int dings(Blah* irgendwas); als Prototyp. Damit der Compiler Blah* schluckt, habe oberhalb der Deklaration von dings(...) einen weiteren Prototyp: struct Blah;.
Nun ist der Compiler unzufrieden: Beim Aufruf von:

Code: Alles auswählen

Blah* meinblah=new Blah;
dings(meinblah);
heisst es: cannot convert 'main():Blah*' to 'Blah*' for argument '1' to 'int dings(Blah*)'.
Ich hab da wohl was gebastelt und muss nun den Preis bezahlen. Wie krieg' ich das jetzt sauber hin?
lg
Kalsan
Zuletzt geändert von kalsan am 1. August 2014 16:16, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: cannot convert 'main():Blah*' to 'Blah*' for argument...

Beitrag von Christian81 »

Etwas mehr Code wäre hilfreich aber deine beiden Struktruen Blah und main()::blah sind für den Compiler unterschiedliche Strukturen - die eine im globalen Namespace, die andere im Namespace von main()
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
kalsan

Re: cannot convert 'main():Blah*' to 'Blah*' for argument...

Beitrag von kalsan »

Der Original-Code ist zu komplex, als dass es sich lohnen würde, ihn zu posten. Somit fasse ich das Wesentliche zusammen:

Code: Alles auswählen

struct Block;
struct WfEBlock;
int wfeToClauseBuffer(WfEBlock* currentWfE); // Nur Prototyp, Funktion ist noch nicht implementiert.
int main()
{
    struct Block{
       int id;
    };
    struct WfEBlock:Block{
        list<Block*> blockList;
    };
    WfEBlock* rootBlock = new RootBlock; // Build up root
    if(!wfeToClauseBuffer(rootBlock)){cout<<"Error 0"<<endl; return EXIT_FAILURE;}
}

Code: Alles auswählen

main.cpp:168: Fehler: cannot convert 'main()::WfEBlock*' to 'WfEBlock*' for argument '1' to 'int wfeToClauseBuffer(WfEBlock*)'
    if(!wfeToClauseBuffer(rootBlock)){cout<<"Error 0"<<endl; return EXIT_FAILURE;}
bmann
Beiträge: 14
Registriert: 22. Juni 2006 22:27
Wohnort: Dortmund

Re: cannot convert 'main():Blah*' to 'Blah*' for argument...

Beitrag von bmann »

Hallo Kalsan,

wie Christian81 schon gesagt hat, sind die "struct Blah" die du in main() deklariert und definiert hast, sowie die "struct Blah" die du *außerhalb* von main() (forward-)deklariert hast, zwei verschiedene Dinge.
Die eine struct heißt für den Compiler "main():Blah" und die andere einfach nur "Blah".

Deine Funktion erwartet einen Pointer auf eine struct vom Typ "Blah", du übergibst aber einen Pointer vom Typ "main():Blah".

Kurz gesagt: Eine struct die in einer Funktion deklariert/definiert wurde kann außerhalb dieser Funktion nicht benutzt werden. Übrigens hat das zur Folge, dass eine solche struct auch nicht als Template Parameter herhalten kann (d.h. "list<Blah>" geht nur wenn Blah außerhalb von main() existiert).
Ziehe deine struct also aus main() raus, dann sollte es gehen.
kalsan

Re: cannot convert 'main():Blah*' to 'Blah*' for argument...

Beitrag von kalsan »

Ach so. Alle structs inkl. Inheritance raus. Mein Fehler beim Pröbeln war, dass ich nur gewisse structs rausgenommen habe und daher eine Vervielfachung der Fehlermeldungen erzielte.
Nun ist alles klar. Vielen Dank!
lg, Kalsan
Antworten