2016-04-20 16 views
0

Wie kann ich einen (scheinbar vom Compiler generierten impliziten) Aufruf zu einer überladenen operator() - Funktion finden?Kann mysteriösen Aufruf zu überladenem Operator nicht finden()

Die Ausgabe von g ++ ist nur

/tmp/<garbagename.o>:(.rodata._ZTVN3MAT3A1DIiEE[_ZTVN3MAT3A1DIiEE]+0x50): 
undefined reference to `A1D<int>::operator()(A1D<int>)' 

Nein „in Funktion“ oder einer anderen Angabe, wo die Funktion aufgerufen wird. GERADE DIESE EINE LINIE DER AUSGABE - NICHTS MEHR außer Fehler: ld gab 1 Ausgangsstatus zurück.

Der Code, den undefinierten Referenz verursacht ich nur auf die nicht funktionierende Skelett reduziert haben:

A1D<int> find(A1D<bool> data) { 
    A1D<int> nothing; 
    return nothing; 
} 

Es ist eine Kopie Konstruktor für A1D aber es ruft nicht Operator(). Endergebnis:

1) Die Funktion ist deklariert (in der Vorlage Klasse Deklaration für A1D): virtuellen Inline-A1D-Operator() (A1D A);

2) Ich habe absichtlich A1D :: operator() (A1D) nicht definiert, weil ich vermutete, dass meine Implementierung dafür aufgerufen wurde, als ich es nicht erwartet hatte. Also ... Ich verstehe, warum es undefiniert ist. Ich verstehe nicht, warum darauf verwiesen wird, weil ich keine Referenzen sehe.

3) Wiederum erwarte ich nicht, dass die Funktion aufgerufen wird, da sie in meinem Code nirgends als referenziert erscheint.

3) Ich reduzierte mein Hauptprogramm auf ein leeres main() {} mit nur einem Include der Template-Header-Datei mit der Definition für A1D und einer zweiten Header-Datei mit der Definition von find().

4) Wenn ich die Definition für die Funktion find entfernen, dann verschwindet der Fehler und die ausführbare Datei (die nichts tut) verlinkt ohne Fehler.

5) Ich bin mir bewusst, dass die Kopie Konstruktor für A1D für die find() Funktion als Teil der Rück Verknüpfung aufgerufen, aber ich sehe keinen Zusammenhang zwischen diesem und dem Operator() (A1D) Funktion.

Ich möchte den G ++ - Compiler zu sagen, warum es einen Aufruf von Operator() (A1D) generiert. Ich habe versucht "-v", aber das war nicht hilfreich. Irgendwelche Vorschläge?

Danke!

Antwort

0

Durch Experimente habe ich festgestellt, dass die "virtuelle" Erklärung das Problem teilweise erklärt. Obwohl die Funktion inline ist und niemals explizit oder implizit von meinem Code aufgerufen wird, scheint es, dass g ++ es definiert haben möchte. Wenn es nicht als virtuell deklariert ist, benötigt der Compiler/Linker keine Definition.

Ich ging diese Straße (absichtlich keine Funktion zu definieren), um herauszufinden, warum/wo die Funktion aufgerufen wurde. Offensichtlich wird g ++ nicht kooperieren. Ich werde auf eine andere Art debuggen müssen.

Ich habe noch zwei Beschwerden über g ++ zu diesem Posting bezogen werden:

1) Es scheint nicht, dass eine Inline-Funktion, die nie aufgerufen wird, sollte festgelegt werden muß, auch wird es virtuell deklariert.

2) Es besteht die Notwendigkeit, in der Lage zu sein, g ++ zu bitten, dem Programmierer mitzuteilen, WARUM es auf einen bestimmten Einsprungpunkt in der von ihm erzeugten Objektdatei verweist. Explizite Referenz? C++ Sprache impliziter Aufruf? Etwas anderes? Und wo im Code des Benutzers wurde die entsprechende Regel aufgerufen? ....