Re: gcc 3.3.2 problem with STL MAP container

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Moten,

  I think this is *best* explained by the gcc release notes for 3.4

  This release is the first one to throw this as an error and not a
warning as you can produce in gcc 3.3.

  http://gcc.gnu.org/gcc-3.4/changes.html

  Under C++.  The third bullet.

  The summary is that you need to explicitly specify that
const_iterator with the 'typename' keyword before it.

corey


On Sun, 06 Feb 2005 15:12:22 +0100, Morten.Gulbrandsen
<f1000mhz@xxxxxxxx> wrote:
> Hello,
> 
> Nice to have the list members back on the net,
> 
> I have a problem with some  Standard  template Library  code  examples.
> 
> It looks nice on the paper,  but my GCC  3.3.2   womits.
> 
> I have consulted a nice tutorial introduction about  templates   and
> especially STL,
> 
> so the code is from here :
> 
> http://www.libertyassociates.com/pages/files/TYCPP4eSource2.zip
> 
> Please help  here are the error messages:
> 
> 4eList1910_UNIX.cpp:
> In function
> `void ShowMap(const std::map<T, A,   std::less<_Key>,
> std::allocator<std::pair<const _Key, _Tp> > >&)':
> 4eList1910_UNIX.cpp:
> 107: error:
>             parse error before `=' token
> 
> //
> // Display map properties
> //
> template<class T, class A>
> void ShowMap(const map<T, A>& v)
> {
>   for (map<T, A>::const_iterator ci = v.begin();  //  line  107
> 
> /*=======================!!=========================*/
> 
>                                 ci != v.end(); ++ci)
>         cout << ci->first << ": " << ci->second << "\n";
> 
>     cout << endl;
> }
> 
> 4eList1910_UNIX.cpp:
> In function
> `void ShowMap(const std::map<T, A,   std::less<_Key>,
> std::allocator<std::pair<const _Key, _Tp> > >&)
> [with T =  std::string, A = Student]':
> 
> 4eList1910_UNIX.cpp:93:   instantiated from here
> 
> template<class T, class A>
> void ShowMap(const map<T, A>& v);    // display map properties
> 
> typedef map<string, Student>    SchoolClass;
> 
>         ShowMap(MathClass);   //  Line  93
> 
> 4eList1910_UNIX.cpp:107: error: `ci' undeclared (first use this function)
> 4eList1910_UNIX.cpp:107: error: (Each undeclared identifier is reported
> only
>    once for each function it appears in.)
> 
> g++ -v
> Reading specs from /opt/sfw/gcc-3/lib/gcc-lib/i386-pc-solaris2.9/3.3.2/specs
> Configured with: ../gcc-3.3.2/configure --prefix=/opt/sfw/gcc-3
> --with-ld=/usr/ccs/bin/ld --with-as=/usr/ccs/bin/as --without-gnu-ld
> --without-gnu-as --enable-shared
> Thread model: posix
> gcc version 3.3.2
> 
> I compiled and linked without any makefile,  using these options
> 
> g++ -ansi -pedantic -Wall -o 4eList1910_UNIX.out 4eList1910_UNIX.cpp -L
> /opt/sfw/gcc-3/lib/ -R /opt/sfw/gcc-3/lib/ -lstdc++
> 
> obviously the code  is not free from warnings and not  ANSI   compatible,
> but if I use these options
> 
> g++  -o 4eList1910_UNIX.out 4eList1910_UNIX.cpp -L /opt/sfw/gcc-3/lib/
> -R /opt/sfw/gcc-3/lib/ -lstdc++
> 4eList1910_UNIX.cpp: In function `void ShowMap(const std::map<T, A,
>    std::less<_Key>, std::allocator<std::pair<const _Key, _Tp> > >&)':
> 4eList1910_UNIX.cpp:107: warning: `std::map<T, A, std::less<_Key>,
>    std::allocator<std::pair<const _Key, _Tp> > >::const_iterator' is
> implicitly
>    a typename
> 4eList1910_UNIX.cpp:107: warning: implicit typename is deprecated,
> please see
>    the documentation for details
> 
> without  the  command line   -options    -ansi -pedantic  -Wall
> 
> the code compiles, links and actually runs.
> 
> Please help.
> 
> How can I improve the code, in order to make it  unambiguous  for gcc
> 3.3.2  ?
> 
> Yours Sincerely
> 
> Morten Gulbrandsen
> 
> 
> #include <iostream>
> #include <string>
> #include <map>
> using namespace std;
> 
> class Student
> {
> public:
>         Student();
>         Student(const string& name, const int age);
>         Student(const Student& rhs);
>         ~Student();
> 
>         void    SetName(const string& name);
>         string  GetName()       const;
>         void    SetAge(const int age);
>         int             GetAge()        const;
> 
>         Student& operator=(const Student& rhs);
> 
> private:
>         string itsName;
>         int itsAge;
> };
> 
> Student::Student()
> : itsName("New Student"), itsAge(16)
> {}
> 
> Student::Student(const string& name, const int age)
> : itsName(name), itsAge(age)
> {}
> 
> Student::Student(const Student& rhs)
> : itsName(rhs.GetName()), itsAge(rhs.GetAge())
> {}
> 
> Student::~Student()
> {}
> 
> void Student::SetName(const string& name)
> {
>         itsName = name;
> }
> 
> string Student::GetName() const
> {
>         return itsName;
> }
> 
> void Student::SetAge(const int age)
> {
>         itsAge = age;
> }
> 
> int Student::GetAge() const
> {
>         return itsAge;
> }
> 
> Student& Student::operator=(const Student& rhs)
> {
>         itsName = rhs.GetName();
>         itsAge = rhs.GetAge();
>         return *this;
> }
> 
> ostream& operator<<(ostream& os, const Student& rhs)
> {
>         os << rhs.GetName() << " is " << rhs.GetAge() << " years old";
>         return os;
> }
> 
> template<class T, class A>
> void ShowMap(const map<T, A>& v);    // display map properties
> 
> typedef map<string, Student>    SchoolClass;
> 
> int main()
> {
>         Student Harry("Harry", 18);
>         Student Sally("Sally", 15);
>         Student Bill("Bill", 17);
>         Student Peter("Peter", 16);
> 
>         SchoolClass     MathClass;
>         MathClass[Harry.GetName()] = Harry;
>         MathClass[Sally.GetName()] = Sally;
>         MathClass[Bill.GetName()] = Bill;
>         MathClass[Peter.GetName()] = Peter;
> 
>         cout << "MathClass:\n";
>         ShowMap(MathClass);
> 
>         cout << "We know that " << MathClass["Bill"].GetName()
>                  << " is " << MathClass["Bill"].GetAge() << " years old\n";
> 
>         return 0;
> }
> 
> //
> // Display map properties
> //
> template<class T, class A>
> void ShowMap(const map<T, A>& v)
> {
>         for (map<T, A>::const_iterator ci = v.begin();
>                                         ci != v.end(); ++ci)
>                 cout << ci->first << ": " << ci->second << "\n";
> 
>         cout << endl;
> }
> 
> /*
> 
> g++ -ansi -pedantic -Wall -o 4eList1910_UNIX.out 4eList1910_UNIX.cpp -L /opt/sfw/gcc-3/lib/ -R /opt/sfw/gcc-3/lib/ -lstdc++
> 
> 4eList1910_UNIX.cpp: In function `void ShowMap(const std::map<T, A,
>    std::less<_Key>, std::allocator<std::pair<const _Key, _Tp> > >&)':
> 4eList1910_UNIX.cpp:107: error: parse error before `=' token
> 4eList1910_UNIX.cpp: In function `void ShowMap(const std::map<T, A,
>    std::less<_Key>, std::allocator<std::pair<const _Key, _Tp> > >&) [with T =
>    std::string, A = Student]':
> 4eList1910_UNIX.cpp:93:   instantiated from here
> 4eList1910_UNIX.cpp:107: error: `ci' undeclared (first use this function)
> 4eList1910_UNIX.cpp:107: error: (Each undeclared identifier is reported only
>    once for each function it appears in.)
> 
> g++ -v
> Reading specs from /opt/sfw/gcc-3/lib/gcc-lib/i386-pc-solaris2.9/3.3.2/specs
> Configured with: ../gcc-3.3.2/configure --prefix=/opt/sfw/gcc-3 --with-ld=/usr/ccs/bin/ld --with-as=/usr/ccs/bin/as --without-gnu-ld --without-gnu-as --enable-shared
> Thread model: posix
> gcc version 3.3.2
> 
> */
> 
> 
>

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux