ambiguous template parameter?!?!



  • Hallo an alle.
    Ich habe hier ein kleines Problemchen. Villeicht kenn ja jemand die Lösung, um den Fehler "ambiguous template parameter" zu vermeiden.
    Die Fehlermeldung unter .NET lautet:

    c:\Dokumente und Einstellungen\dima\Eigene Dateien\Visual Studio
    Projects\SignedEnergyDataParser\Tester\StringTokenizer2.cpp(24): error
    C2782: '_InIt std::find_if(_InIt,_InIt,_Pr)' : template parameter '_InIt' is
    ambiguous
    

    Der Quellcode lautet (zumindest ein Ausschnitt wo der Fehler auftaucht):
    [cpp]
    void CStringTokenizer::ParseString(const Delimer& rDelim) {
    //First clear the results vector
    std::string::const_iterator it = m_rStr.begin();
    std::string::const_iterator itTokenEnd = m_rStr.begin();
    //Eat seperators
    while(it != m_rStr.end()) {
    if(rDelim(*it)) it++;
    //Find next token
    itTokenEnd = find_if(it, m_rStr.end(), rDelim);
    //Append token to result
    if(it < itTokenEnd) push_back(std::string(it, itTokenEnd));
    it = itTokenEnd;
    }
    }
    [/cpp]
    der Fettmarkierte Teil bereitet mir Probleme.
    Falls jemand mir helfen könnte, wäre ich sehr dankbar.
    Danke in Voraus



  • Probiers mal so:

    void CStringTokenizer::ParseString(const Delimer& rDelim) {
       //First clear the results vector
       std::string::const_iterator it = m_rStr.begin();
       std::string::const_iterator itTokenEnd = m_rStr.begin();
          //Eat seperators
       while(it != itTokenEnd) {
          if(rDelim(*it)) it++;
          //Find next token
          itTokenEnd = find_if(it, itTokenEnd, rDelim);
          //Append token to result
          if(it < itTokenEnd) push_back(std::string(it, itTokenEnd));
          it = itTokenEnd;
       }
    }
    


  • Gib die template-Parameter von Hand mit:

    itTokenEnd = find_if<typeof(it), typeof(rDelim)>(it, m_rStr.end(), rDelim);
    

    Das Problem ist, dass er sich sonst nicht entscheiden kann, ob er mit std::string::iterator oder std::string::const_iterator konkretisieren soll.



  • typeof? Wusste gar nicht, dass das schon Standard ist. 😃



  • alternativ kannst du auch dies nehmen:

    std::string::const_iterator itStrEnd = m_rStr.end();
    // ...
    itTokenEnd = find_if(it, itStrEnd, rDelim);
    

    p.s. Bist du sicher dass dein Delimer kein Delimiter ist? 😃



  • ich danke euch vielmals. Es funktioniert:)



  • finix schrieb:

    alternativ kannst du auch dies nehmen:

    std::string::const_iterator itStrEnd = m_rStr.end();
    // ...
    itTokenEnd = find_if(it, itStrEnd, rDelim);
    

    Oder einfach:

    itTokenEnd = find_if(it, const_cast<const string&>(m_rStr).end(), rDelim);
    

Anmelden zum Antworten