Compile error.

Discussion in 'C++' started by Hill, Nov 15, 2008.

  1. Hill

    Hill Guest

    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<typename T>
    class Map{
    template<typename 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()const;
    };
    template<typename T>
    T& Map<T>::eek:perator[](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(Pair<T>(name,T()));
    return vec.back().val;
    }
    template<typename T>
    void Map<T>::print_all()const
    {
    for(CIT p = vec.begin(); p != vec.end();++p){
    cout << p->name << ": " << p->val << endl;
    }
    }
    int main()
    {
    Map<int> m;
    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<Map<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<Map<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>::eek:perator[](const
    std::string&)' does not match any in class `Map<T>'
    13.8.cpp:24: error: candidate is: double& Map<T>::eek:perator[](const
    std::string&)
    13.8.cpp:29: error: template definition of non-template `T&
    Map<T>::eek:perator[](const std::string&)'
    13.8.cpp: In member function `T& Map<T>::eek:perator[](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_all() 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
    Hill, Nov 15, 2008
    #1
    1. Advertising

  2. Hill

    Barry Guest

    On 11ÔÂ15ÈÕ, ÏÂÎç9ʱ43·Ö, Hill <> 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<typename T>
    > class Map{
    > template<typename 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()const;};
    >
    > template<typename T>
    > T& Map<T>::eek:perator[](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(Pair<T>(name,T()));
    > return vec.back().val;}
    >
    > template<typename T>
    > void Map<T>::print_all()const
    > {
    > for(CIT p = vec.begin(); p != vec.end();++p){
    > cout << p->name << ": " << p->val << endl;
    > }}
    >
    > int main()
    > {
    > Map<int> m;
    > 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<Map<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<Map<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>::eek:perator[](const
    > std::string&)' does not match any in class `Map<T>'
    > 13.8.cpp:24: error: candidate is: double& Map<T>::eek:perator[](const
    > std::string&)
    > 13.8.cpp:29: error: template definition of non-template `T&
    > Map<T>::eek:perator[](const std::string&)'
    > 13.8.cpp: In member function `T& Map<T>::eek:perator[](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_all() 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, Nov 15, 2008
    #2
    1. Advertising

  3. Hill

    Hill Guest

    On 11ÔÂ15ÈÕ, ÏÂÎç10ʱ54·Ö, Barry <> wrote:
    > On 11ÔÂ15ÈÕ, ÏÂÎç9ʱ43·Ö, Hill <> 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<typename T>
    > > class Map{
    > > template<typename 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()const;};

    >
    > > template<typename T>
    > > T& Map<T>::eek:perator[](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(Pair<T>(name,T()));
    > > return vec.back().val;}

    >
    > > template<typename T>
    > > void Map<T>::print_all()const
    > > {
    > > for(CIT p = vec.begin(); p != vec.end();++p){
    > > cout << p->name << ": " << p->val << endl;
    > > }}

    >
    > > int main()
    > > {
    > > Map<int> m;
    > > 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<Map<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<Map<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>::eek:perator[](const
    > > std::string&)' does not match any in class `Map<T>'
    > > 13.8.cpp:24: error: candidate is: double& Map<T>::eek:perator[](const
    > > std::string&)
    > > 13.8.cpp:29: error: template definition of non-template `T&
    > > Map<T>::eek:perator[](const std::string&)'
    > > 13.8.cpp: In member function `T& Map<T>::eek:perator[](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_all() 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::eek:stream;

    template<typename T>
    struct Aligner{
    union{
    long double long_double_;
    long long_;
    void (*simple_function_ptr)();
    };
    };

    template<typename T>
    class Map{
    template<typename U>
    struct Pair{
    string name;
    union{
    char raw_mem[sizeof(U)];
    Aligner<U> dummy;
    }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()const;
    };
    template<typename T>
    Pair<T>& Map<T>::eek:perator[](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(Pair<T>(name));
    return vec.back();
    }
    template<typename T>
    void Map<T>::print_all()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<<(ostream& os, const stu& s)
    {
    return os << " Name: " << s.name << " Id: " << s.id ;
    }

    int main()
    {
    Map<stu> m;
    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
    Hill, Nov 16, 2008
    #3
  4. Hill

    Guest

    On Nov 15, 6:43 pm, Hill <> 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<typename T>
    > class Map{
    > template<typename 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()const;};
    >
    > template<typename T>
    > T& Map<T>::eek:perator[](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(Pair<T>(name,T()));
    > return vec.back().val;}
    >
    > template<typename T>
    > void Map<T>::print_all()const
    > {
    > for(CIT p = vec.begin(); p != vec.end();++p){
    > cout << p->name << ": " << p->val << endl;
    > }}
    >
    > int main()
    > {
    > Map<int> m;
    > 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<Map<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<Map<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>::eek:perator[](const
    > std::string&)' does not match any in class `Map<T>'
    > 13.8.cpp:24: error: candidate is: double& Map<T>::eek:perator[](const
    > std::string&)
    > 13.8.cpp:29: error: template definition of non-template `T&
    > Map<T>::eek:perator[](const std::string&)'
    > 13.8.cpp: In member function `T& Map<T>::eek:perator[](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_all() 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<typename T>
    class Map{
    struct Pair{
    string name;
    T val;
    Pair(string n ="", U v):name(n),val(v){}
    };
    vector<Pair> vec;


    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
    , Nov 17, 2008
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Nagaraj
    Replies:
    1
    Views:
    854
    Lionel B
    Mar 1, 2007
  2. timjowers
    Replies:
    7
    Views:
    4,339
    heyjude
    Feb 2, 2011
  3. Replies:
    1
    Views:
    448
    Cowboy \(Gregory A. Beamer\)
    Apr 11, 2008
  4. Carter
    Replies:
    2
    Views:
    501
    Carter
    Mar 4, 2009
  5. fAnSKyer
    Replies:
    2
    Views:
    530
    Alf P. Steinbach
    Jun 7, 2009
Loading...

Share This Page