error: 'cit' was not declared in this scope

Gerry Sweeney gerry.sweeney@blueyonder.co.uk
Wed Dec 30 03:49:00 GMT 2009


Hi John,

Thats perfect and solved my problem, thank you very much. I now have a 
better understanding of what the compiler is expecting.  The compiler could 
certinaly do with a more explicit error message in this scenario, perhaps 
something like:-

    test.cpp:30: error: The item base_type::const_iterator is not known as a 
type

certainly would have helped

I did not go with the second "using" option as I thought it was less 
readable than being explicit about what is being called - at least for me it 
worked better that way.

Regards,

Gerry

----- Original Message ----- 
From: "John S. Fine" <johnsfine@verizon.net>
To: "Gerry Sweeney" <gerry.sweeney@blueyonder.co.uk>
Cc: <gcc-help@gcc.gnu.org>
Sent: Tuesday, December 29, 2009 7:49 PM
Subject: Re: error: 'cit' was not declared in this scope


> You are focusing on the second error, but that was just a consequence of 
> the first.
>
> During the initial parsing, the compiler doesn't know that types from the 
> base class are types, because it doesn't know what the base class will be 
> until it has the template actuals.
>
> You can tell it that types are types using the typename keyword in each 
> place where you use them.
>
> I think that is a bad style, and it is better to bring such types into the 
> current class with a typedef as in
>
>       typedef std::map<Key, Value> base_type;
>       typedef typename base_type::const_iterator const_iterator;
> ...
>       const_iterator cit = base_type::find(key);
>
> But in similar style, I also think "using" is better than individual 
> overrides for functions that should be inherited from the base class:
>
>       typedef std::map<Key, Value> base_type;
>       typedef typename base_type::const_iterator const_iterator;
>       using base_type::find;
> ...
>       const_iterator cit = find(key);
>




More information about the Gcc-help mailing list