template Problem mit iterator



  • Hallo

    mein Problem findet sich in der Print Funktion in folgendem Code:

    #include <iostream>
    #include <vector>
    
    template<typename T>
    class A
    {
        public:
            A(const T& v): val(v){}
            virtual ~A(){}
    
            T val;
    
    };
    
    template<typename T>
    class ManyA
    {
        private:
            std::vector< A<T> > avec ;
    
        public:
            ManyA()
            {
            }
    
            ~ManyA()
            {
            }
    
            void add( const A<T>& a )
            {
                avec.push_back(a);
            }
    
            void Print(){
    
                for( std::vector< A<T> >::iterator pos = avec.begin();
                                            pos = avec.begin(); ++pos)
                {
    
                    std::cout << pos->val << "\n"
    
                }
                std::cout << std::endl;
            }
    
    };
    
    int main()
    {
    
        A<int> aint1(10);
        A<int> aint2(20);
    
        ManyA<int> manyA;
    
        manyA.add( aint1 ) ;
        manyA.add( aint2 ) ;
    
        manyA.Print();
    
    }
    

    das
    std::vector< A<T> >::iterator pos = avec.begin();
    kompiliert nicht

    wie bekomm ich einen Iterator von avec?

    danke für die Hilfe



  • - Die Bedingung ist das Problem da muss "!= end()" stehen und nicht "= begin()"
    - Da fehlt ein ;

    MfG SideWinder



  • Hast du dir überhaupt mal die Fehlermeldung angeschaut? Jeder halbwegs aktuelle Compiler sollte dir da einen genügenden Hinweis zum fehlenden ; geben. Und den anderen Fehler hättest du relativ leicht mit einem Debugger gefunden..



  • das 2x pos = avec.begin() steht ist ein Abschreibfehler der mir passiert ist.

    die Zeile ist orignial so

    for( std::vector< A<T> >::iterator pos = avec.begin(); pos != avec.end(); ++pos)

    also anscheinend prinzipiell richtig.

    Compilermeldung ist:

    ..In member function ‘void ManyA<T>::Print()’:
    ..error: expected `;' before ‘pos’|

    was absolut nicht funktinoiert ist den Iterator zu erstellen

    ich kann irgendwo in ManyA das
    std::vector< A<T> >::iterator Iter;
    hinschreiben, immer der gleiche Compilerfehler

    ..error: expected `;' before ‘VARIABLENNAME’|

    codeblocks + gcc 4.2.3



  • Ich reduziere das Problem noch mal auf das notwendigste

    template<typename T>
    class A
    {
        public:
            A(const T& v): val(v){}
            virtual ~A(){}
    
            T val;
    
    };
    
    template<typename T>
    class ManyA
    {
        private:
            std::vector< A<T> > avec ;
            std::vector< A<T> >::iterator Iter; // Fehler !!
    
        public:
            ManyA()
            {
            }
    
            ~ManyA()
            {
            }
    };
    

    Meldung:

    error: type ‘std::vector<A<T>, std::allocator<A<T> > >’ is not derived from type ‘ManyA<T>’|
    error: expected ‘;’ before ‘Iter’|



  • Schreib "typename" davor:

    typename std::vector< A<T> >::iterator Iter;
    

    MfG SideWinder



  • Danke!



  • Nun erkundige dich aber auch schleunigst, warum du das machen musst! Das du mir hier ja nicht zum blinden Abschreiber wirst!

    MfG SideWinder


Log in to reply