Seite 1 von 1

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

Verfasst: 31. Juli 2014 20:59
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

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

Verfasst: 31. Juli 2014 21:28
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()

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

Verfasst: 1. August 2014 09:58
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;}

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

Verfasst: 1. August 2014 15:26
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.

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

Verfasst: 1. August 2014 16:16
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