[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.c++

Compile error.

Hill

11/15/2008 1:43:00 PM

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






3 Answers

Barry

11/15/2008 2:54:00 PM

0

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

11/16/2008 11:39:00 AM

0

On 11?15?, ??10?54?, Barry <dhb2...@gmail.com> wrote:
> 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<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>::operator[](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>::operator[](const
> > std::string&)' does not match any in class `Map<T>'
> > 13.8.cpp:24: error: candidate is: double& Map<T>::operator[](const
> > std::string&)
> > 13.8.cpp:29: error: template definition of non-template `T&
> > Map<T>::operator[](const std::string&)'
> > 13.8.cpp: In member function `T& Map<T>::operator[](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::ostream;

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>::operator[](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









mail.dsp

11/17/2008 6:21:00 AM

0

On Nov 15, 6:43 pm, 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<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>::operator[](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>::operator[](const
> std::string&)' does not match any in class `Map<T>'
> 13.8.cpp:24: error: candidate is: double& Map<T>::operator[](const
> std::string&)
> 13.8.cpp:29: error: template definition of non-template `T&
> Map<T>::operator[](const std::string&)'
> 13.8.cpp: In member function `T& Map<T>::operator[](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