bsp Programm aus Stroustrups buch funktioniert nicht?



  • Hallo, ich hab auf Seite 640 von "Die C++ Programmiersprache" ein Beispiel gefunden und rätsele jetzt herum warum dass nich kompiliert, mein Compiler ist
    gcc (SUSE Linux) 4.3.1 20080507 (prerelease)

    So hier mal das Bsp:

    #include <iostream>
    #include<algorithm>
    using namespace std;
    template <typename CH> class basic_substring{
    public:
        typedef typename basic_string<CH>::size_type size_type;
    
        basic_substring(basic_string<CH> &sarg, size_type iarg, size_type narg):s(sarg),i(iarg),n(narg){   }
    
        basic_substring<CH> &operator=(const basic_string<CH> &substring){
            s.replace(i,n,substring);
            n=substring.length();
        }
        operator basic_string<CH>()const{
            return basic_string<CH>(s,i,n);
        }
        operator const CH*()const{
            const char *c = copy(s.c_str()+i,s.c_str()+n+i,new char[n]) -n;
            return c;
    
        }
    private:
        basic_string<CH> &s;
        size_type i;
        size_type n;
    };
    typedef basic_substring<char> Substring;
    int main(int argc, char *argv[])
    {
        string s="Class information items are simple name--value pairs that are specified using Q_CLASSINFO() in the source code.";
        Substring su(s,0,50);
        string s2="lawl"+Substring(s,0,50);         ///Hier gibts ne Fehlermeldung                                    
        cout<<s2<<endl;
        return 0;
    }
    

    Hat jemand ne Idee warum die Addition mit dem Substring nicht Funktioniert/Compiliert?

    gruesse theBuck



  • Du solltest schon immer sagen, welcher Fehler kommt.
    Wenn es der hier ist:

    error: no match for 'operator+' in 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >(((const char*)"lawl"), ((const std::allocator<char>&)((const std::allocator<char>*)(& std::allocator<char>())))) + basic_substring<char>(((std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)(& s)), 0ul, 50ul)'
    

    Dann scheinst du das Programm nicht komplett abgetippt zu haben, bzw. es kommt auf den nächsten Seiten eine Ergänzung. (Auf die Gefahr hin geschlagen zu werden: ich hab das Buch nicht...)


  • Administrator

    Da fehlt definitiv noch ein #include <string> .

    Grüssli



  • Hallo, ich schätze mal Herr Stroustrup hatte vergessen zu erwähnen, dass man noch einen operator in dieser Form überladen muss:

    typedef basic_substring<char> Substring;
    template <typename CH>
            string operator +(const CH *c,basic_substring<CH> s){
        return c+s.operator basic_string<CH>();
    }
    

    Ich war allerdings überrascht dass es mögich ist sowas zu machen:

    #include <iostream>
    #include<string>
    #include<algorithm>
    using namespace std;
    template <typename CH> class basic_substring{
    public:
        typedef typename basic_string<CH>::size_type size_type;
    
        basic_substring(basic_string<CH> &sarg, size_type iarg, size_type narg):s(sarg),i(iarg),n(narg){   }
    
        basic_substring<CH> &operator=(const basic_string<CH> &substring){
            s.replace(i,n,substring);
            n=substring.length();
        }
        operator int()const{
            return 5;
    
        }
    private:
        basic_string<CH> &s;
        size_type i;
        size_type n;
    };
    int main(int argc, char *argv[])
    {
        string s="text";
        cout<<5+basic_substring<char>(s,0,3)<<endl; ///Augen hierdrauf.
        return 0;
    }
    

    Deswegen dachte ich dass es bei dem Bsp vom ersten Post auch so funktionieren kann.

    Gruss theBuck



  • thebuck schrieb:

    Hallo, ich schätze mal Herr Stroustrup hatte vergessen zu erwähnen, dass man noch einen operator in dieser Form überladen muss: [...]

    Der operator wird in <string> mitgeliefert. Du hast vermutlich einfach nur den #include vergessen/übersehen.

    PS: wenn du statt der [code]-Tags [cpp]-Tags verwendest gibts für deinen Code noch Syntax-Coloring frei Haus!


Anmelden zum Antworten