[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.c++

reference to const static object variable

Bob Doe

11/14/2008 7:23:00 PM

I have a const static object. What is the right syntax to get a
reference to the std::vector within the std::map variable?:

class MyObj
{
public:
...
std::map<std::string,
std::vector<std::string> > l_;
};

static MyObj obj;

int main()
{
...
const std::vector<std::string> &regexList = obj.l_["key"]; //
compiler error
...
};



5 Answers

Obnoxious User

11/14/2008 8:31:00 PM

0

On Fri, 14 Nov 2008 11:23:28 -0800, Bob Doe wrote:

> I have a const static object. What is the right syntax to get a
> reference to the std::vector within the std::map variable?:
>
> class MyObj
> {
> public:
> ...
> std::map<std::string,
> std::vector<std::string> > l_;
> };
>
> static MyObj obj;
>
> int main()
> {
> ...
> const std::vector<std::string> &regexList = obj.l_["key"]; //
> compiler error
> ...
> };

Did you care to read the error message? What did it say?

--
OU
Remember 18th of June 2008, Democracy died that afternoon.
http://frapedia.se/wiki/Information_...

Bob Doe

11/14/2008 9:25:00 PM

0

sorry,

The example should have been:

class MyObj
{
public:
MyObj()
{
std::vector<std::string> t;
t.push_back("zzz");
l_["a"] = t;
}

std::map<std::string,
std::vector<std::string> > l_;
};

const static MyObj obj;

int main()
{
const std::vector<std::string> &regexList = obj.l_["key"];
}


-----
I want to maintain the const-ness of MyObj, and have read access to
the std::vector within std::map...

and the error message says:

passing `const
map<basic_string<char,string_char_traits<char>,__default_alloc_template<false,
0>
>,vector<basic_string<char,string_char_traits<char>,__default_alloc_template<false,
0>
>,allocator<basic_string<char,string_char_traits<char>,__default_alloc_template<false,
0> > >
>,less<basic_string<char,string_char_traits<char>,__default_alloc_template<false,
0> >
>,allocator<vector<basic_string<char,string_char_traits<char>,__default_alloc_template<false,
0>
>,allocator<basic_string<char,string_char_traits<char>,__default_alloc_template<false,
0> > > > > >' as `this' argument of `class
vector<basic_string<char,string_char_traits<char>,__default_alloc_template<false,
0>
>,allocator<basic_string<char,string_char_traits<char>,__default_alloc_template<false,
0> > > > &
map<basic_string<char,string_char_traits<char>,__default_alloc_template<false,
0>
>,vector<basic_string<char,string_char_traits<char>,__default_alloc_template<false,
0>
>,allocator<basic_string<char,string_char_traits<char>,__default_alloc_template<false,
0> > >
>,less<basic_string<char,string_char_traits<char>,__default_alloc_template<false,
0> >
>,allocator<vector<basic_string<char,string_char_traits<char>,__default_alloc_template<false,
0>
>,allocator<basic_string<char,string_char_traits<char>,__default_alloc_template<false,
0> > > > > >::operator [](const string &)' discards qualifiers


Which I don't understand.

const static MyObj obj;

On Nov 14, 12:30 pm, Obnoxious User <O...@127.0.0.1> wrote:
> On Fri, 14 Nov 2008 11:23:28 -0800, Bob Doe wrote:
> > I have a const static object.  What is the right syntax to get a
> > reference to the std::vector within the std::map variable?:
>
> > class MyObj
> > {
> >    public:
> >      ...
> >      std::map<std::string,
> >                   std::vector<std::string> > l_;
> > };
>
> >  static MyObj obj;
>
> > int main()
> > {
> >   ...
> >   const std::vector<std::string> &regexList = obj.l_["key"];  //
> > compiler error
> >   ...
> > };
>
> Did you care to read the error message? What did it say?
>
> --
> OU
> Remember 18th of June 2008, Democracy died that afternoon.http://frapedia..se/wiki/Information_in_English

James Kanze

11/14/2008 11:00:00 PM

0

On Nov 14, 10:24 pm, Bob Doe <DumpForJ...@gmail.com> wrote:
> sorry,

> The example should have been:

> class MyObj
> {
>    public:
>       MyObj()
>       {
>          std::vector<std::string> t;
>          t.push_back("zzz");
>          l_["a"] = t;
>       }

>       std::map<std::string,
>                std::vector<std::string> > l_;
> };

> const static MyObj obj;

> int main()
> {
>    const std::vector<std::string> &regexList = obj.l_["key"];

Have you looked at the documentation of std::map<>:operator[]?
What does it do?

Since it modifies the map, you can't use it on a const object.
> }

> I want to maintain the const-ness of MyObj, and have read
> access to the std::vector within std::map...

Then operator[] isn't the function you want. Something like:


std::map< std::string, std::vector< std::string >
>::const_iterator
entry = obj.l_[ "key" ] ;
if ( entry != obj.l_.end() ) {
std::vector< std::string > const&
regexList = entry->second ;
// ...
}

maybe. (Or maybe std::map isn't what you really want, except
buried deep in the implementation of something with a more
congenial interface.)

--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Obnoxious User

11/15/2008 8:11:00 AM

0

On Fri, 14 Nov 2008 14:59:46 -0800, James Kanze wrote:

> On Nov 14, 10:24 pm, Bob Doe <DumpForJ...@gmail.com> wrote:
>> sorry,
>
[snip]
>
>> I want to maintain the const-ness of MyObj, and have read access to the
>> std::vector within std::map...
>
> Then operator[] isn't the function you want. Something like:
>
>
> std::map< std::string, std::vector< std::string >
>>::const_iterator
> entry = obj.l_[ "key" ] ;

const_iterator entry = obj.find("key");

> if ( entry != obj.l_.end() ) {
> std::vector< std::string > const&
> regexList = entry->second ;
> // ...
> }
>

--
OU
Remember 18th of June 2008, Democracy died that afternoon.
http://frapedia.se/wiki/Information_...

James Kanze

11/15/2008 10:02:00 AM

0

On Nov 15, 9:11 am, Obnoxious User <O...@127.0.0.1> wrote:
> On Fri, 14 Nov 2008 14:59:46 -0800, James Kanze wrote:
> > On Nov 14, 10:24 pm, Bob Doe <DumpForJ...@gmail.com> wrote:
> >> sorry,

> [snip]

> >> I want to maintain the const-ness of MyObj, and have read
> >> access to the std::vector within std::map...

> > Then operator[] isn't the function you want.  Something like:

> >     std::map< std::string, std::vector< std::string >
> >>::const_iterator
> >                         entry = obj.l_[ "key" ] ;

> const_iterator entry = obj.find("key");

Yes, obviously.

> >     if ( entry != obj.l_.end() ) {
> >         std::vector< std::string > const&
> >                             regexList = entry->second ;
> >         // ...
> >     }

--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34