gcc 3.3.2 problem with STL MAP container

Morten.Gulbrandsen f1000mhz@yahoo.de
Tue Feb 8 21:40:00 GMT 2005


corey taylor wrote:

>Morten,
>
>Yes, you could even write the keyword 'typename' in the for statement.
>
>Did you read the 3rd C++ bullet at http://gcc.gnu.org/gcc-3.4/changes.html?
>
>Basically, it is saying that any type from a template parameter, must
>be explicitly marked as such with the 'typename' keyword.
>
>corey
>  
>


Hi List,
Hi Corey:
the URL says:

/****/
You must now use the typename and template keywords to disambiguate 
dependent names, as required by the C++ standard.


     // Use 'template' to tell the parser that B is a nested
      //  template class (dependent on template parameter T), and
      //  'typename' because the whole A<T>::B<int> is
      //  the name of a type (again, dependent).

      typename A<T>::template B<int> b;

      b.callme();

/*****/

sure, Corey,  this was indeed helpful. 
I haven't tried all it says, but now I know where to find the 
interesting 'typename' part of the C++  documentation.

however,  I would still prefer to use my old  gcc 3.3.2 

What I don't quite understand is this :


g++  -o  foo.out  sourcecode.cpp  

-L   /opt/sfw/gcc-3/lib/

-R  /opt/sfw/gcc-3/lib/ 

-lstdc++



I read on the net in the excellent  solarisx86 mailing  list  that I had 
to use the -L  -R  flags.

http://groups.yahoo.com/group/solarisx86/message/18055

where can I find more documentation about this solarisx86  specific issue ?

Is it likely that  other libraries  can be used ?

I also prefer to compile with the flags  -ansi  -pedantic -Wall   for  
both C  and C++ code.

===

It is not important but I did not succeed in writing  the for statement 
with any typename

 typename  map<T, A>::const_iterator ci;
 
                        for (   ci = v.begin();

could not be changed to

  
 map<T, A>::const_iterator ci;
 
                    for (  typename   ci = v.begin();



best regards

Morten Gulbrandsen





>
>On Mon, 07 Feb 2005 19:54:58 +0100, Morten.Gulbrandsen
><f1000mhz@yahoo.de> wrote:
>  
>
>>corey taylor wrote:
>>
>>    
>>
>>>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
>>>
>>>
>>>
>>>
>>>      
>>>
>>Thanks,  this should be correct ?
>>
>>//
>>// Display map properties
>>//
>>template<class T, class A>
>>void ShowMap(const map<T, A>& v)
>>{
>>
>>  typename  map<T, A>::const_iterator  ci;
>>
>>    for ( ci = v.begin();  ci != v.end();  ++ci)
>>        cout << ci->first << ": " << ci->second << "\n";
>>
>>    cout << endl;
>>}
>>
>>instead of   incorrect :
>>
>>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;
>>>}
>>>      
>>>
>>if this is correct then I have inderstood it,
>>
>> 'typename'  was greek to me
>>
>>best regards
>>
>>Morten Gulbrandsen
>>
>>
>>    
>>
>
>  
>





More information about the Gcc-help mailing list