error - instantiated from here



  • Hi,

    ich erhalte die folgende Fehlermeldung, die ich aber leider nicht ganz verstehe:

    maggy:CancerSim praktikant$ make -f makefile2.txt
    g++  -c -O3  `/Users/praktikant/Desktop/wxMac-2.8.10/build-ansi/wx-config --cxxflags`  -c -o Multi_Grid_View.o Multi_Grid_View.cc
    Array_2d.h: In member function ‘void Array_2d<T, C>::set_all(typename C::const_reference) [with T = std::bitset<32ul>::reference, C = Bit_Vector]’:
    Multi_Grid_View.cc:86:   instantiated from here
    Array_2d.h:47: error: ‘class Bit_Vector’ has no member named ‘begin’
    Array_2d.h:47: error: ‘class Bit_Vector’ has no member named ‘end’
    make: *** [Multi_Grid_View.o] Error 1
    

    Hier der entsprechende Code:
    Multi_Grid_View.cc (nur ein Teil, weil sehr groß)

    #include "Multi_Grid_View.h"
    #ifdef __WXMAC__
    #     include <OpenGL/gl.h>
    #else
    #     include <GL/gl.h>
    #endif
    
    #include "Point_3d.h"
    #include "Array_3d_Strip.h"
    #include "Bit_Array_3d.h"
    
    // this performs a logical xor; i.e. it returns true only if exactly one of the arguments is 0
    template<class T>
    inline bool l_xor(T a, T b) { return !a ^ !b; };
    
    Multi_Grid_View::Face Multi_Grid_View::flood(
      const Const_Slice<Values>& s1, 
      const Const_Slice<Values>& s2, 
      int i, int j, int k, 
      Bit_Array_2d *done)
    {
      int i2 = i+1;
      int j2 = j+1;
    
      done->at(i,j)=true;
    
      const Value v = s1(i,j);
      const Value v2 = s2(i,j);
    
      for(; j2 < s1.nj() && !done->at(i,j2) && s1(i,j2)==v && s2(i,j2)==v2; ++j2)
        done->at(i,j2)=true;
    
      // grow i
      for(int jj=j2; jj==j2 && i2 < s1.ni(); )
      {
        for(jj=j; jj < j2 && !done->at(i2, jj) && s1(i2,jj)==v && s2(i2,jj)==v2; ++jj);
        if(jj == j2)
        {
          for(jj=j; jj < j2; ++jj)
    	done->at(i2, jj) = true;
          ++i2;
        }
      }
    
      return Multi_Grid_View::Face(i,j,i2,j2,k,v?v:v2);
    }
    
    Multi_Grid_View::Multi_Grid_View()
    {
      m_display_list=0;
    }
    
    Multi_Grid_View::~Multi_Grid_View()
    {  
      if(m_display_list)
        glDeleteLists(m_display_list, 1);
    }
    
    void Multi_Grid_View::add_faces(std::vector<Multi_Grid_View::Face> * up_faces, 
    	       std::vector<Multi_Grid_View::Face> * down_faces, 
    	       const Const_Slice<Values>& s1, 
    	       const Const_Slice<Values>& s2, 
    	       int k)
    {
      Bit_Array_2d done(s1.ni(), s1.nj());
      done.set_all(false);  //<-- hier ist die Zeile 86
      for(int i=0; i < s1.ni(); ++i)
        for(int j=0; j < s1.nj(); ++j)
          if(!done(i,j) && l_xor(s1(i,j), s2(i,j)))
    	(s1(i,j) ? up_faces : down_faces)->push_back(flood(s1, s2, i,j,k, &done));
    }
    

    hier ist Array_2d.h

    #ifndef ARRAY2DHFILE
    #define ARRAY2DHFILE
    
    #include <assert.h>
    #include <vector>
    
    template<class T, class C = std::vector<T> >
    class Array_2d
    {
    public:
    
      typedef typename C::reference reference;
      typedef typename C::const_reference const_reference;
    
      Array_2d() : m_rows(0), m_cols(0) { };
      Array_2d(int rows, int cols) { resize(rows,cols); };
    
      reference at(int row, int col) { assert(is_index(row,col)); return m_elem[map2d(row,col)]; };
      reference operator()(int row, int col) { return at(row,col); };
    
      const_reference at(int row, int col) const { assert(is_index(row,col)); return m_elem[map2d(row,col)]; };
      const_reference operator()(int row, int col) const { return at(row,col); };
    
      const bool is_index(int row, int col) const { return row >= 0 && row < rows() &&
    						  col >= 0 && col < cols(); };
    
      void set_all(const_reference t) { std::fill(m_elem.begin(), m_elem.end(), t); };  //<-- hier ist Zeile 47
    
      void resize(int rows, int cols) { m_rows=rows; m_cols=cols; m_elem.resize(rows*cols); };
    
      int rows() const { return m_rows; };
      int cols() const { return m_cols; };
    
    protected:
    
      int map2d(int row, int col) const { return col+row*m_cols; };
    
      int m_rows;
      int m_cols;
    
      C m_elem;
    };
    
    #include <iosfwd>
    
    template<class T>
    std::ostream & operator<<(std::ostream & os, const Array_2d<T> & a)
    {
      for(int i=0; i < a.rows(); ++i)
      {
        for(int j=0; j < a.cols(); ++j)
          os << a(i,j) << ' ';
    	  os << std::endl;
      }
      return os;
    }
    
    #endif
    

    und zu guter letzt Bit_Vector.h

    #ifndef BIT_VECTOR_H_FILE
    #define BIT_VECTOR_H_FILE
    
    #include <bitset>
    #include <vector>
    
    // this bit vector differs from the std::vector<bool> specialization
    // in that it supports bitwise operators.
    
    // this should not be used directly in code; use Bit_Vector::Word_Size wherever possible
    #define Bit_Vector_Word_Size 32
    
    class Bit_Vector
    {
    public:
      static const size_t Word_Size;
      typedef std::bitset<Bit_Vector_Word_Size> Elem;
      typedef Elem::reference reference;
      typedef bool const_reference;
      typedef std::vector<Elem> Cont;
    
      Bit_Vector() : m_size(0) { };
      Bit_Vector(size_t num_bits) { resize(num_bits); };
    
      reference at(size_t n) { assert(is_index(n)); return m_bits[n/Word_Size][n%Word_Size]; };
      reference operator[](size_t n) { return at(n); };
    
      const_reference at(size_t n) const { assert(is_index(n)); return m_bits[n/Word_Size][n%Word_Size]; };
      const_reference operator[](size_t n) const { return at(n); };
    
      bool is_index(size_t n) const { return n >= 0 && n < size(); };
      size_t size() const { return m_size; }; // get the number of bits.
    
      void resize(size_t n) { m_bits.resize(n/Word_Size + (n % Word_Size ? 1 : 0)); m_size=n; };
    
      void set() { for(Cont::iterator i=m_bits.begin(); i!=m_bits.end(); ++i) i->set(); };
      void reset() { for(Cont::iterator i=m_bits.begin(); i!=m_bits.end(); ++i) i->reset(); };
    
      Bit_Vector & operator&=(const Bit_Vector & rhs) {
        assert(size() <= rhs.size());
        Cont::const_iterator i2=rhs.m_bits.begin();
        for(Cont::iterator i=m_bits.begin(); i!=m_bits.end(); ++i, ++i2) *i &= *i2; return *this; };
    
      Bit_Vector & operator|=(const Bit_Vector & rhs) { 
        assert(size() <= rhs.size());
        Cont::const_iterator i2=rhs.m_bits.begin();
        for(Cont::iterator i=m_bits.begin(); i!=m_bits.end(); ++i, ++i2) *i |= *i2; return *this; };
    
      Bit_Vector & operator^=(const Bit_Vector & rhs) { 
        assert(size() <= rhs.size());
        Cont::const_iterator i2=rhs.m_bits.begin();
        for(Cont::iterator i=m_bits.begin(); i!=m_bits.end(); ++i, ++i2) *i ^= *i2; return *this; };
    
      Bit_Vector & flip() {
        for(Cont::iterator i=m_bits.begin(); i!=m_bits.end(); ++i) i->flip(); return *this; };
    
      std::bitset<Bit_Vector_Word_Size> word(int i) const { assert(i>=0&&i<(int)m_bits.size()); return m_bits[i]; };
    
    protected:
    
      Cont m_bits;
      size_t m_size;
    
    };
    
    std::ostream & operator<<(std::ostream & os, Bit_Vector v);
    
    #endif
    

    Puh, das ist ne Menge, ich weiß, aber es wäre sehr nett, wenn mir jemand helfen könnte, da ich die erste Fehlermeldung gar nicht verstehe und ebenfalls nicht verstehe, warum er begin() und end() nicht kennt.

    Danke!


  • Mod

    c++_NewB schrieb:

    Puh, das ist ne Menge, ich weiß, aber es wäre sehr nett, wenn mir jemand helfen könnte, da ich die erste Fehlermeldung gar nicht verstehe und ebenfalls nicht verstehe, warum er begin() und end() nicht kennt.

    😕

    Genau das sagt doch die Fehlermeldung: begin() und end() kennt der compiler nicht. Und der Grund ist auch klar: begin() und end() gibt es nicht in der Klasse Bit_Vector.



  • c++_NewB schrieb:

    Hi,

    ich erhalte die folgende Fehlermeldung, die ich aber leider nicht ganz verstehe:

    maggy:CancerSim praktikant$ make -f makefile2.txt
    g++  -c -O3  `/Users/praktikant/Desktop/wxMac-2.8.10/build-ansi/wx-config --cxxflags`  -c -o Multi_Grid_View.o Multi_Grid_View.cc
    Array_2d.h: In member function ‘void Array_2d<T, C>::set_all(typename C::const_reference) [with T = std::bitset<32ul>::reference, C = Bit_Vector]’:
    Multi_Grid_View.cc:86:   instantiated from here
    Array_2d.h:47: error: ‘class Bit_Vector’ has no member named ‘begin’
    Array_2d.h:47: error: ‘class Bit_Vector’ has no member named ‘end’
    make: *** [Multi_Grid_View.o] Error 1
    

    Heißt übersetzt: "In Array_2d.h, Zeile 47, beziehst du dich auf das Member begin, das es nicht gibt. Die Funktion set_all, um die es da geht, hast du in Multi_Grid_View.cc, Zeile 86 aufgerufen (bzw. dafür gesorgt dass das Template instantiiert wurde)."

    Wenn du dir den Code anschaust, siehst du, dass es um den Aufruf m_elem.begin() geht, m_elem ist vom Typ C, was in dem Fall Bit_Vector ist. Und der hat scheinbar kein begin().



  • ich dachte eigentlich, dass begin() und end() schon vordefinierte Iteratoren sind, außerdem wird in Bit_vector ja auch begin und end verwendet und da beschwert er sich ja auch nicht...



  • c++_NewB schrieb:

    ich dachte eigentlich, dass begin() und end() schon vordefinierte Iteratoren sind, außerdem wird in Bit_vector ja auch begin und end verwendet und da beschwert er sich ja auch nicht...

    Bei eigenen Klassen ist nichts vordefiniert. Und Bit_vector verwendet intern die begin()- und end()-Methoden des bitset-members, hat aber selbst keine eigenen begin()- und end()-Methoden. und auf die versucht dein Template zuzugreifen.


Anmelden zum Antworten