Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Compile error.

Reply
Thread Tools

Compile error.

 
 
Hill
Guest
Posts: n/a
 
      11-15-2008
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>: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>:rint_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>:air<T>,
std::allocator<Map<T>:air<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>:air<T>,
std::allocator<Map<T>:air<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>:perator[](const
std::string&)' does not match any in class `Map<T>'
13.8.cpp:24: error: candidate is: double& Map<T>:perator[](const
std::string&)
13.8.cpp:29: error: template definition of non-template `T&
Map<T>:perator[](const std::string&)'
13.8.cpp: In member function `T& Map<T>: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>:rint_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






 
Reply With Quote
 
 
 
 
Barry
Guest
Posts: n/a
 
      11-15-2008
On 11月15日, 下午9时43分, Hill <(E-Mail Removed)> 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>: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>:rint_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>:air<T>,
> std::allocator<Map<T>:air<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>:air<T>,
> std::allocator<Map<T>:air<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>:perator[](const
> std::string&)' does not match any in class `Map<T>'
> 13.8.cpp:24: error: candidate is: double& Map<T>:perator[](const
> std::string&)
> 13.8.cpp:29: error: template definition of non-template `T&
> Map<T>:perator[](const std::string&)'
> 13.8.cpp: In member function `T& Map<T>: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>:rint_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


 
Reply With Quote
 
 
 
 
Hill
Guest
Posts: n/a
 
      11-16-2008
On 11月15日, 下午10时54分, Barry <(E-Mail Removed)> wrote:
> On 11月15日, 下午9时43分, Hill <(E-Mail Removed)> 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>: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>:rint_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>:air<T>,
> > std::allocator<Map<T>:air<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>:air<T>,
> > std::allocator<Map<T>:air<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>:perator[](const
> > std::string&)' does not match any in class `Map<T>'
> > 13.8.cpp:24: error: candidate is: double& Map<T>:perator[](const
> > std::string&)
> > 13.8.cpp:29: error: template definition of non-template `T&
> > Map<T>:perator[](const std::string&)'
> > 13.8.cpp: In member function `T& Map<T>: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>:rint_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: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>: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>:rint_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









 
Reply With Quote
 
mail.dsp@gmail.com
Guest
Posts: n/a
 
      11-17-2008
On Nov 15, 6:43 pm, Hill <(E-Mail Removed)> 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>: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>:rint_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>:air<T>,
> std::allocator<Map<T>:air<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>:air<T>,
> std::allocator<Map<T>:air<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>:perator[](const
> std::string&)' does not match any in class `Map<T>'
> 13.8.cpp:24: error: candidate is: double& Map<T>:perator[](const
> std::string&)
> 13.8.cpp:29: error: template definition of non-template `T&
> Map<T>:perator[](const std::string&)'
> 13.8.cpp: In member function `T& Map<T>: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>:rint_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
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
compile directive for conditional compile for Java 1.4 versus Java 5 timjowers Java 7 02-02-2011 12:08 AM
How to compile the following source code in VC6// I have error inVC++6 but compile ok in GCC fAnSKyer C++ 2 06-07-2009 07:57 AM
computation at compile time i.e. compile time functions usingtemplates Carter C++ 2 03-04-2009 06:43 PM
Compile versus not compile (VS 2005)?? stupid48@gmail.com ASP .Net 1 04-11-2008 08:24 PM
cant compile on linux system.cant compile on cant compile onlinux system. Nagaraj C++ 1 03-01-2007 11:18 AM



Advertisments