Argument ist mehrdeutig in std::search



  • genom.cpp(26): error C2782: "_FwdIt1 std::search(_FwdIt1,_FwdIt1,_FwdIt2,_FwdIt2)": template-Parameter "_FwdIt1" ist mehrdeutig.

    void CGenom::SearchSequences() {
    	//================================>
    	//==================>
    	_seq.clear();
    	//TODO: Die Sequenzen überschneiden sich. Am Ende sollte überprüft werden, welche Sequenz von von überschneidenen am häufigsten ist.
    	//Durchsuche die DNA solange, bis das letzte Stück nicht mehr die benötigte Länge der Sequenz erreicht
    	for (vector<char>::const_iterator it=_dna.begin();it+_M <= _dna.end();it++) {
    		//Nächste Sequenz allokieren
    		_seq.push_back(CSequence(it, it+_M));
    		//===============>
    		//Durchsuche den Teil der DNA vor der Sequenz
    		for (vector<char>::const_iterator it_search=_dna.begin();it_search + _M  <= it;it_search++) { //TODO: WIRD DER ERSTE DURCHGANG AUSGEFÜHRT????
    			//Vor der Sequenz suchen
    			it_search = search(it_search, it, it, it+_M); //falls nichts gefunden wird, ist it_search == it
    			//Falls etwas gefunden wurde
    			if (it_search != it) {
    				_seq.back().IncreaceOccurence();
    			}
    		}
    		//Debug-Ausgabe
    		if ( _seq.back().NumberOfOccurence() != 1) cout << "[DEBUG] Vor der Sequenz wurden " << _seq.back().NumberOfOccurence() << " Kopien gefunden." << endl;
    		//==================>
    		//Durchsuche den Teil nach der Sequenz
    		for (vector<char>::const_iterator it_search=it+1;it_search+_M <= _dna.end();it_search++) {
    			//Vor der Sequenz suchen
    			it_search = search(it_search, _dna.end(), it, it+_M); //hier liegt das problem 
    			//Falls etwas gefunden wurde
    			if (it_search != it) {
    				_seq.back().IncreaceOccurence();
    			}
    		}
    	}
    }
    

    Der Fehler liegt also bei it+_M.

    Ich bin ehrlich gesagt etwas irritiert. Die Aufgabe (habe ich über Google gefunden) ist es, einen DNA-Part nach besonders häufigen Sequenzen zu durchsuchen. Dazu habe ich den DNA-part in einen vector<char> geladen. Anschliessend durchsuche ich den Vektor vor und nach der Sequenz nach potentiellen "Kopien" (also Sequenzen die exakt gleich sind). Leider will std::search allerdings meine Parameter nicht annehmen.

    Das Ziel des Aufrufes ist das Durchsuchen der DNA nach (also nach der Speicherstelle im Vektor) der momentanen Sequenz.
    it: iterator, welcher zur momentanen Sequenz zeigt.
    1. Argument: it_search (beginnt bei it+1)
    2. Argument: _dna.end() ==> es soll zwischen der Sequenz und dem Ende gesucht werden
    3. Argument: it ==> beginn der Sequenz, nach der gesucht werden soll
    4. Argument: it+_M ===> Ende der Sequenz, welche eine Länge von M hat.


  • Mod

    Basisklasse schrieb:

    Der Fehler liegt also bei it+_M.

    Nein, der Fehler liegt bei den ersten zwei Parametern. Diese haben unterschiedlichen Typ (const_iterator und iterator) und der Compiler weiß deshalb nicht, mit welchem Typen er das search-Template instanzieren soll. Ist _dna hier nicht const? Beziehungsweise sollte die ganze Methode nicht const sein? Dann wäre klar, dass mit _dna.end() auch der const-Iterator gemeint ist. Falls ja: Korrigier das und es wird funktionieren. Falls nein: In C++11 gibt es cend() als Containermethode, welches garantiert einen const_iterator zurück gibt, ohne C++11 musst du irgendwie rumpfuschen, z.B. eine const-Referenz auf den Container benutzen.



  • Ja du hast Recht. Eigentlich dachte ich, dass Visual C++ Express 2010 noch kein C++11 hat, aber die Memberfunktion cend() habe ich trotzdem zur Verfügung.
    (Die Methode ist nicht konstant, weil _seq geändert wird)
    Allerdings gibt mir search jetzt einen falschen Iterator zurück, da der Iterator einen Wert annimmt, der gar nicht möglich ist. Danach kriege ich auch den Fehler, dass er nicht mehr inkrementierbar ist. Aber eigentlich sollte der zurückgegebende Iterator, im Falle das nichts gefunden wird, doch _dna.cend() sein, oder?

    it_search_back = search(it_search_back, _dna.cend(), it, it+_M); //search gibt einen falschen Iterator zurück, sodass das programm beim inkrementieren im schleifenkopf
    //abstürzt
    

    Eigentlich würde ich jetzt aus Verzweiflung das Programm nen bisschen umbauen, aber es würde mich doch noch interessieren warum search einen falschen Iterator zurück gibt.



  • Basisklasse schrieb:

    Ja du hast Recht. Eigentlich dachte ich, dass Visual C++ Express 2010 noch kein C++11 hat

    Warum denkst du sowas? Das klingt nach bloßer Vermutung - grade in der Übergangszeit ist es aber immer gut zu wissen, wieviel C++11 die einzelnen Compiler unterstützen (zumindest die, die man benutzt).


  • Mod

    Basisklasse schrieb:

    Eigentlich würde ich jetzt aus Verzweiflung das Programm nen bisschen umbauen, aber es würde mich doch noch interessieren warum search einen falschen Iterator zurück gibt.

    Die Frage ist eigentlich eher, wie du das überhaupt festgestellt hast. Du darfst ruhig davon ausgehen, dass du keinen Fehler in der Standardbibliothek gefunden hast, sondern, dass ein unerwarteter Effekt bei ihrer Benutzung auf einen Fehler deinerseits zurück zu führen ist.



  • std::search gibt dir in diesem Fall _dna.cend() zurück, das ist richtig. Das Problem ist, dass du diesen nicht nochmal erhöhen darfst, es aber im Schleifenkopf tust.

    _M ist übrigens ein reservierter Bezeichner, den du nicht benutzen darfst (sofern du nicht die Standardbibliothek selbst schreibst).



  • Die Frage ist eigentlich eher, wie du das überhaupt festgestellt hast. Du darfst ruhig davon ausgehen, dass du keinen Fehler in der Standardbibliothek gefunden hast, sondern, dass ein unerwarteter Effekt bei ihrer Benutzung auf einen Fehler deinerseits zurück zu führen ist.

    Das ist mir schon klar. Ich wollte eher wissen, warum gibt std::search einen falschen Iterator zurück[,ich es auf diese Weise benutze] 😉
    Ich habe es über den Debugger rausgefunden.

    std::search gibt dir in diesem Fall _dna.cend() zurück, das ist richtig. Das Problem ist, dass du diesen nicht nochmal erhöhen darfst, es aber im Schleifenkopf tust.

    Ah, das verstehe ich. Ich werde es gleich mal ausprobieren.


Anmelden zum Antworten