2016-01-25 9 views
5

Ich frage mich, warum es nicht erlaubt ist, zu schreiben:Deklaration und Deklaration mit Definition. Warum ist das nicht erlaubt?

struct foo {  
    void bar();          // declaration 
    void bar(){std::cout << "moo" << std::endl;} // declaration + definition 
}; 

Die Funktion zweimal deklariert wird (ich dachte, das ist in Ordnung) und einmal definiert. Allerdings ist mein Compiler beschwert sich über:

decldef.cxx:7:10: error: 'void foo::bar()' cannot be overloaded 

Warum ist es nicht erlaubt?

Warum interpretiert mein Compiler (g ++ 4.7.2) dies als Überlastung?

PS: Ich weiß, wie man es "den richtigen Weg" schreibt, aber ich möchte nur wissen, warum das oben genannte falsch ist.

+0

Tat aber diese Frage geht meiner Meinung nach zumindest tiefer. Wenn zum Beispiel "struct" durch "namespace" ersetzt wurde, ist der Code gültig. – Bathsheba

+0

Gute Frage, wirklich.Der "+ Definition" -Teil ist eigentlich irrelevant; auch eine wiederholte Deklaration mit identischer Unterschrift ist hier nicht erlaubt. – mindriot

Antwort

10

Von §9.3

Außer Mitglied Funktionsdefinitionen, die außerhalb einer Klassendefinition erscheinen, und mit Ausnahme der expliziten Spezialisierungen von Elementfunktionen von Klassen-Templates und Mitgliedsfunktionsschablonen (14,7), die außerhalb des erscheinen Klassendefinition, Eine Mitgliedsfunktion soll nicht umbenannt werden.

Darüber hinaus fallen die Aussagen in diesem Fall können auch Foul von:

eine Elementfunktion kann (8.4) in seiner Klassendefinition definiert werden, in welchem ​​Fall es sich um eine Funktion inline Mitglieds (7.1.2), oder es kann außerhalb seiner Klassendefinition definiert werden, wenn es bereits deklariert aber nicht in seiner Klassendefinition definiert ist.

Da die erste Deklaration nicht die Funktion zu inline deklariert. Die zweite Definition tut dies implizit.

Allerdings scheint dieser auf Reflexion weniger überzeugend.

+3

Wenn dies die richtige Antwort ist, warum ist 'struct foo {void bar(); Leere Leiste(); }; 'scheitern mit der gleichen Fehlermeldung? – DevSolar

+0

@DevSolar aktualisiert, um Ihre Frage zu beantworten. –

+4

Der zweite Teil, den Sie zitiert haben, beantwortet wirklich die Frage; "Eine Mitgliedsfunktion darf nicht neu deklariert werden". Der Inlining-Unterschied spielt in diesem Zusammenhang keine Rolle. – mindriot

5

Die Funktion wird zweimal deklariert (ich dachte, das ist in Ordnung) und einmal definiert.

Dies ist unabhängig davon, ob Sie die Funktion beim zweiten Mal definieren oder nicht. Der Punkt ist, dass Sie die Funktion die Funktion zweimal deklarieren, und das ist nicht OK. Diese nicht kompiliert entweder

, mit der gleichen Fehlermeldung:

struct foo { 
    void bar(); 
    void bar(); 
}; 

Sie können nicht die gleiche Funktion mit der gleichen Parameterliste innerhalb der Klassendefinition neu deklarieren:

'void foo::bar()' cannot be overloaded with 'void foo::bar()'. 
+0

In der Tat. Gibt es im Standard irgendwo eine explizite Aussage, die sagt, warum das nicht erlaubt ist? Meiner Meinung nach ist die Fehlermeldung des Compilers im besten Fall irreführend, da dies nicht wirklich eine Überlastung ist ... – mindriot

+0

@mindriot: Richard Hodges hat das Zitat (bearbeitet). Ich habe keine Kopie des C++ - Standards zur Hand. – DevSolar