ungelöste externe...



  • Hi Leute,

    mein lieblings Fehler ist wieder aufgetaucht.

    "Ungelöste externe 'func_math::multiplicativeExpr(System::AnsiString, int&)' referenziert von C:\Dokumente und Einstellungen\root\Eigene Dateien\Borland Studio-Projekte\Debug_build\main.obj"

    die angegebene Funktion ist:

    namespace func_math{
    using std;
    
    c_real multiplicativeExpr(AnsiString s, int& i); // prototypen ...
    c_real potentialExpr(AnsiString s, int& i);
    c_real primaryExpr(AnsiString s, int&  i);
    
    c_real additiveExpr(const AnsiString& s, int& i){
    	c_real result = multiplicativeExpr(s, i);
    	while((i<=s.Length())&&(isOneOf(s[i], "+-"))){
    		char op = nextChar(s, i);
    		if(op == '+'){
    			result += multiplicativeExpr(s,i);
    		}
    		else if(op == '-'){
    			result -= multiplicativeExpr(s, i);
    		}
    		return result;
    		}
    };
    c_real multiplicativeExpr(const AnsiString& s, int& i){
    	c_real result = potentialExpr(s, i);
    	while((i<=s.Length())&&isOneOf(s[i],"*/")){
    		char op = nextChar(s, i);
    		if(op=='*')
    			result*= potentialExpr(s, i);
    		else if(op=='/')
    			result /= potentialExpr(s, i);
    	}
    	return result;
    };
    ...
    
    };
    

    Wie man vielleicht sieht ein rekursiver parser ...
    c_real ist dabei eine Klasse von mir. Ich schätze mal der code ist hier unerheblich. Der Fehler rtat aus dem Nichts auf - vielleicht habe ich gerade an der Reihenfolge der Funktionsdefinition gedreht und einzelne Funktionen mit Copy'n'Paste hoch und runtergeschoben, aber sonst nichts gemacht. Woher kommen diese Fehler denn beim täglichen programmieren (nein, ich war nicht in den Builder-Options oder habe den Compiler disassembliert und verändert ...oder ähnliches)...



  • Die Signatur stimmt doch gar nicht. const AnsiString& != AnsiString



  • Erstmal: Danke, ja, das geht!

    Der Fehler gibt immer relativ wenig Auskunft, was man denn vielleicht machen könnte, damit er nicht mehr erscheint ...



  • Der Fehler kommt auch vom Linker, und dem bleibt nichts anderes übrig. Der Compiler könnte den Fehler theoretisch bemerken (der Delphi-Compiler tut das beispielsweise), aber da in C++ Funktionen implizit, d.h. ohne Angabe eines Modifizierers wie "overload" in Delphi, überladen werden können, muß er annehmen, du wolltest die Funktion überladen.


Anmelden zum Antworten