Compile error.

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Hill

    Compile error.

    This is an simple map, just an exercise. Who can help me fix this
    compile issue?Thanks in advance.
    #include <string>
    #include <vector>
    #include <iostream>
    using std::vector;
    using std::string;
    using std::cout;
    using std::endl;

    template<typena me T>
    class Map{
    template<typena me U>
    struct Pair{
    string name;
    U val;
    Pair(string n ="", U v):name(n),val( v){}
    };
    vector<Pair<T vec;
    Map(const Map&);
    Map& operator=(const Map&);
    typedef vector<Pair<T:: const_iterator CIT;
    typedef vector<Pair<T:: iterator IT;
    public:
    Map(){}
    double& operator[](const string&);
    void print_all()cons t;
    };
    template<typena me T>
    T& Map<T>::operato r[](const string& name)
    {
    IT it = vec.begin();
    IT end = vec.end();
    for(; it != end; ++it){
    if(it->name == name) return it->val;
    }
    vec.push_back(P air<T>(name,T() ));
    return vec.back().val;
    }
    template<typena me T>
    void Map<T>::print_a ll()const
    {
    for(CIT p = vec.begin(); p != vec.end();++p){
    cout << p->name << ": " << p->val << endl;
    }
    }
    int main()
    {
    Map<intm;
    m["zhu"] = 100;
    m["li"] = 200;
    m.print_all();
    }


    -*- mode: compilation; default-directory: "e:/tcplex/p2_ch13/" -*-
    Compilation started at Sat Nov 15 21:42:28

    g++ 13.8.cpp
    13.8.cpp:20: error: type `std::vector<Ma p<T>::Pair<T>,
    std::allocator< Map<T>::Pair<T >' is not derived from type `Map<T>'
    13.8.cpp:20: error: ISO C++ forbids declaration of `const_iterator '
    with no type
    13.8.cpp:20: error: expected `;' before "CIT"
    13.8.cpp:21: error: type `std::vector<Ma p<T>::Pair<T>,
    std::allocator< Map<T>::Pair<T >' is not derived from type `Map<T>'
    13.8.cpp:21: error: ISO C++ forbids declaration of `iterator' with no
    type
    13.8.cpp:21: error: expected `;' before "IT"
    13.8.cpp:29: error: prototype for `T& Map<T>::operato r[](const
    std::string&)' does not match any in class `Map<T>'
    13.8.cpp:24: error: candidate is: double& Map<T>::operato r[](const
    std::string&)
    13.8.cpp:29: error: template definition of non-template `T&
    Map<T>::operato r[](const std::string&)'
    13.8.cpp: In member function `T& Map<T>::operato r[](const
    std::string&)':
    13.8.cpp:30: error: `IT' was not declared in this scope
    13.8.cpp:30: error: expected `;' before "it"
    13.8.cpp:31: error: expected `;' before "end"
    13.8.cpp:32: error: `it' was not declared in this scope
    13.8.cpp:32: error: `end' was not declared in this scope
    13.8.cpp: In member function `void Map<T>::print_a ll() const':
    13.8.cpp:41: error: `CIT' was not declared in this scope
    13.8.cpp:41: error: expected `;' before "p"
    13.8.cpp:41: error: `p' was not declared in this scope

    Compilation exited abnormally with code 1 at Sat Nov 15 21:42:28






  • Barry

    #2
    Re: Compile error.

    On 11ÔÂ15ÈÕ, ÏÂÎç9ʱ43·Ö, Hill <zhubi...@gmail .com>wrote:
    This is an simple map, just an exercise. Who can help me fix this
    compile issue?Thanks in advance.
    #include <string>
    #include <vector>
    #include <iostream>
    using std::vector;
    using std::string;
    using std::cout;
    using std::endl;
    >
    template<typena me T>
    class Map{
    template<typena me U>
    struct Pair{
    string name;
    U val;
    Pair(string n ="", U v):name(n),val( v){}
    };
    vector<Pair<T vec;
    Map(const Map&);
    Map& operator=(const Map&);
    typedef vector<Pair<T:: const_iterator CIT;
    typedef vector<Pair<T:: iterator IT;
    const_iterator is a dependent type here,
    try
    typedef typename vector<Pair<T:: const_iterator CIT;
    typedef typename vector<Pair<T:: iterator IT;
    public:
    Map(){}
    double& operator[](const string&);
    void print_all()cons t;};
    >
    template<typena me T>
    T& Map<T>::operato r[](const string& name)
    {
    IT it = vec.begin();
    IT end = vec.end();
    for(; it != end; ++it){
    if(it->name == name) return it->val;
    }
    vec.push_back(P air<T>(name,T() ));
    return vec.back().val; }
    >
    template<typena me T>
    void Map<T>::print_a ll()const
    {
    for(CIT p = vec.begin(); p != vec.end();++p){
    cout << p->name << ": " << p->val << endl;
    }}
    >
    int main()
    {
    Map<intm;
    m["zhu"] = 100;
    m["li"] = 200;
    m.print_all();
    >
    }
    >
    -*- mode: compilation; default-directory: "e:/tcplex/p2_ch13/" -*-
    Compilation started at Sat Nov 15 21:42:28
    >
    g++ 13.8.cpp
    13.8.cpp:20: error: type `std::vector<Ma p<T>::Pair<T>,
    std::allocator< Map<T>::Pair<T >' is not derived from type `Map<T>'
    13.8.cpp:20: error: ISO C++ forbids declaration of `const_iterator '
    with no type
    13.8.cpp:20: error: expected `;' before "CIT"
    13.8.cpp:21: error: type `std::vector<Ma p<T>::Pair<T>,
    std::allocator< Map<T>::Pair<T >' is not derived from type `Map<T>'
    13.8.cpp:21: error: ISO C++ forbids declaration of `iterator' with no
    type
    13.8.cpp:21: error: expected `;' before "IT"
    13.8.cpp:29: error: prototype for `T& Map<T>::operato r[](const
    std::string&)' does not match any in class `Map<T>'
    13.8.cpp:24: error: candidate is: double& Map<T>::operato r[](const
    std::string&)
    13.8.cpp:29: error: template definition of non-template `T&
    Map<T>::operato r[](const std::string&)'
    13.8.cpp: In member function `T& Map<T>::operato r[](const
    std::string&)':
    13.8.cpp:30: error: `IT' was not declared in this scope
    13.8.cpp:30: error: expected `;' before "it"
    13.8.cpp:31: error: expected `;' before "end"
    13.8.cpp:32: error: `it' was not declared in this scope
    13.8.cpp:32: error: `end' was not declared in this scope
    13.8.cpp: In member function `void Map<T>::print_a ll() const':
    13.8.cpp:41: error: `CIT' was not declared in this scope
    13.8.cpp:41: error: expected `;' before "p"
    13.8.cpp:41: error: `p' was not declared in this scope
    >
    Compilation exited abnormally with code 1 at Sat Nov 15 21:42:28

    Comment

    • Hill

      #3
      Re: Compile error.

      On 11ÔÂ15ÈÕ, ÏÂÎç10ʱ54·Ö, Barry <dhb2...@gmail. comwrote:
      On 11ÔÂ15ÈÕ, ÏÂÎç9ʱ43·Ö, Hill <zhubi...@gmail .comwrote:
      >
      >
      >
      This is an simple map, just an exercise. Who can help me fix this
      compile issue?Thanks in advance.
      #include <string>
      #include <vector>
      #include <iostream>
      using std::vector;
      using std::string;
      using std::cout;
      using std::endl;
      >
      template<typena me T>
      class Map{
      template<typena me U>
      struct Pair{
      string name;
      U val;
      Pair(string n ="", U v):name(n),val( v){}
      };
      vector<Pair<T vec;
      Map(const Map&);
      Map& operator=(const Map&);
      typedef vector<Pair<T:: const_iterator CIT;
      typedef vector<Pair<T:: iterator IT;
      >
      const_iterator is a dependent type here,
      try
      typedef typename vector<Pair<T:: const_iterator CIT;
      typedef typename vector<Pair<T:: iterator IT;
      >
      public:
      Map(){}
      double& operator[](const string&);
      void print_all()cons t;};
      >
      template<typena me T>
      T& Map<T>::operato r[](const string& name)
      {
      IT it = vec.begin();
      IT end = vec.end();
      for(; it != end; ++it){
      if(it->name == name) return it->val;
      }
      vec.push_back(P air<T>(name,T() ));
      return vec.back().val; }
      >
      template<typena me T>
      void Map<T>::print_a ll()const
      {
      for(CIT p = vec.begin(); p != vec.end();++p){
      cout << p->name << ": " << p->val << endl;
      }}
      >
      int main()
      {
      Map<intm;
      m["zhu"] = 100;
      m["li"] = 200;
      m.print_all();
      >
      }
      >
      -*- mode: compilation; default-directory: "e:/tcplex/p2_ch13/" -*-
      Compilation started at Sat Nov 15 21:42:28
      >
      g++ 13.8.cpp
      13.8.cpp:20: error: type `std::vector<Ma p<T>::Pair<T>,
      std::allocator< Map<T>::Pair<T >' is not derived from type `Map<T>'
      13.8.cpp:20: error: ISO C++ forbids declaration of `const_iterator '
      with no type
      13.8.cpp:20: error: expected `;' before "CIT"
      13.8.cpp:21: error: type `std::vector<Ma p<T>::Pair<T>,
      std::allocator< Map<T>::Pair<T >' is not derived from type `Map<T>'
      13.8.cpp:21: error: ISO C++ forbids declaration of `iterator' with no
      type
      13.8.cpp:21: error: expected `;' before "IT"
      13.8.cpp:29: error: prototype for `T& Map<T>::operato r[](const
      std::string&)' does not match any in class `Map<T>'
      13.8.cpp:24: error: candidate is: double& Map<T>::operato r[](const
      std::string&)
      13.8.cpp:29: error: template definition of non-template `T&
      Map<T>::operato r[](const std::string&)'
      13.8.cpp: In member function `T& Map<T>::operato r[](const
      std::string&)':
      13.8.cpp:30: error: `IT' was not declared in this scope
      13.8.cpp:30: error: expected `;' before "it"
      13.8.cpp:31: error: expected `;' before "end"
      13.8.cpp:32: error: `it' was not declared in this scope
      13.8.cpp:32: error: `end' was not declared in this scope
      13.8.cpp: In member function `void Map<T>::print_a ll() const':
      13.8.cpp:41: error: `CIT' was not declared in this scope
      13.8.cpp:41: error: expected `;' before "p"
      13.8.cpp:41: error: `p' was not declared in this scope
      >
      Compilation exited abnormally with code 1 at Sat Nov 15 21:42:28
      >
      >
      Thanks very much.
      But now i upgrade the code to let it can hold types without default
      constructor. But caught in another error:
      #include <string>
      #include <vector>
      #include <iostream>
      using std::vector;
      using std::string;
      using std::cout;
      using std::endl;
      using std::ostream;

      template<typena me T>
      struct Aligner{
      union{
      long double long_double_;
      long long_;
      void (*simple_functi on_ptr)();
      };
      };

      template<typena me T>
      class Map{
      template<typena me U>
      struct Pair{
      string name;
      union{
      char raw_mem[sizeof(U)];
      Aligner<Udummy;
      }val;
      Pair(string n = ""):name(n) {}

      Pair& operator=(const U& v){
      new(val.raw_mem ) U(v);
      return *this;
      }
      };
      vector<Pair<T vec;
      Map(const Map&);
      Map& operator=(const Map&);
      typedef typename vector<Pair<T:: const_iterator CIT;
      typedef typename vector<Pair<T:: iterator IT;
      public:
      Map(){}
      Pair<T>& operator[](const string&);
      void print_all()cons t;
      };
      template<typena me T>
      Pair<T>& Map<T>::operato r[](const string&
      name)////////////////////////////line 46
      {
      IT it = vec.begin();
      IT end = vec.end();
      for(; it != end; ++it){
      if(it->name == name) return *it;
      }
      vec.push_back(P air<T>(name));
      return vec.back();
      }
      template<typena me T>
      void Map<T>::print_a ll()const
      {
      for(CIT p = vec.begin(); p != vec.end();++p){
      cout << p->name << ": " << *(T*)(&p->val.raw_mem[0]) << endl;
      }
      }
      struct stu{
      string name;
      string id;
      stu(string n, string i):name(n), id(i){}
      //stu(){}
      };
      ostream& operator<<(ostr eam& os, const stu& s)
      {
      return os << " Name: " << s.name << " Id: " << s.id ;
      }

      int main()
      {
      Map<stum;
      m["first"] = stu("Zhubicen", "011062");
      m.print_all();
      }

      -*- mode: compilation; default-directory: "z:/tcplex/p2_ch13/" -*-
      Compilation started at Sun Nov 16 19:33:03

      g++ 13.8.cpp
      13.8.cpp:46: error: expected constructor, destructor, or type
      conversion before '<' token

      Compilation exited abnormally with code 1 at Sun Nov 16 19:33:03









      Comment

      • mail.dsp@gmail.com

        #4
        Re: Compile error.

        On Nov 15, 6:43 pm, Hill <zhubi...@gmail .comwrote:
        This is an simple map, just an exercise. Who can help me fix this
        compile issue?Thanks in advance.
        #include <string>
        #include <vector>
        #include <iostream>
        using std::vector;
        using std::string;
        using std::cout;
        using std::endl;
        >
        template<typena me T>
        class Map{
        template<typena me U>
        struct Pair{
        string name;
        U val;
        Pair(string n ="", U v):name(n),val( v){}
        };
        vector<Pair<T vec;
        Map(const Map&);
        Map& operator=(const Map&);
        typedef vector<Pair<T:: const_iterator CIT;
        typedef vector<Pair<T:: iterator IT;
        public:
        Map(){}
        double& operator[](const string&);
        void print_all()cons t;};
        >
        template<typena me T>
        T& Map<T>::operato r[](const string& name)
        {
        IT it = vec.begin();
        IT end = vec.end();
        for(; it != end; ++it){
        if(it->name == name) return it->val;
        }
        vec.push_back(P air<T>(name,T() ));
        return vec.back().val; }
        >
        template<typena me T>
        void Map<T>::print_a ll()const
        {
        for(CIT p = vec.begin(); p != vec.end();++p){
        cout << p->name << ": " << p->val << endl;
        }}
        >
        int main()
        {
        Map<intm;
        m["zhu"] = 100;
        m["li"] = 200;
        m.print_all();
        >
        }
        >
        -*- mode: compilation; default-directory: "e:/tcplex/p2_ch13/" -*-
        Compilation started at Sat Nov 15 21:42:28
        >
        g++ 13.8.cpp
        13.8.cpp:20: error: type `std::vector<Ma p<T>::Pair<T>,
        std::allocator< Map<T>::Pair<T >' is not derived from type `Map<T>'
        13.8.cpp:20: error: ISO C++ forbids declaration of `const_iterator '
        with no type
        13.8.cpp:20: error: expected `;' before "CIT"
        13.8.cpp:21: error: type `std::vector<Ma p<T>::Pair<T>,
        std::allocator< Map<T>::Pair<T >' is not derived from type `Map<T>'
        13.8.cpp:21: error: ISO C++ forbids declaration of `iterator' with no
        type
        13.8.cpp:21: error: expected `;' before "IT"
        13.8.cpp:29: error: prototype for `T& Map<T>::operato r[](const
        std::string&)' does not match any in class `Map<T>'
        13.8.cpp:24: error: candidate is: double& Map<T>::operato r[](const
        std::string&)
        13.8.cpp:29: error: template definition of non-template `T&
        Map<T>::operato r[](const std::string&)'
        13.8.cpp: In member function `T& Map<T>::operato r[](const
        std::string&)':
        13.8.cpp:30: error: `IT' was not declared in this scope
        13.8.cpp:30: error: expected `;' before "it"
        13.8.cpp:31: error: expected `;' before "end"
        13.8.cpp:32: error: `it' was not declared in this scope
        13.8.cpp:32: error: `end' was not declared in this scope
        13.8.cpp: In member function `void Map<T>::print_a ll() const':
        13.8.cpp:41: error: `CIT' was not declared in this scope
        13.8.cpp:41: error: expected `;' before "p"
        13.8.cpp:41: error: `p' was not declared in this scope
        >
        Compilation exited abnormally with code 1 at Sat Nov 15 21:42:28
        In your code if type U is not specially treated than type T as well as
        it is directly dependent on type T then why did you introduce type U.
        Better to remove it.

        template<typena me T>
        class Map{
        struct Pair{
        string name;
        T val;
        Pair(string n ="", U v):name(n),val( v){}
        };
        vector<Pairvec;


        Pair(string n ="", U v)
        In this definition you're providing default argument from left side
        which is not acceptable at all according to C++.


        typedef vector<Pair<T:: const_iterator CIT;
        In this statement you're missing typename keyword. Use the following
        statement
        typedef typename vector<Pair<T:: const_iterator CIT;


        double& operator[](const string&);
        Why return type is double???

        Check all these things and your compilation error will be removed.


        --
        Daya

        Comment

        Working...