reference to const static object variable

Discussion in 'C++' started by Bob Doe, Nov 14, 2008.

  1. Bob Doe

    Bob Doe Guest

    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
    ...
    };
     
    Bob Doe, Nov 14, 2008
    #1
    1. Advertising

  2. Bob Doe

    Bob Doe Guest

    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> > > > > >::eek:perator [](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
     
    Bob Doe, Nov 14, 2008
    #2
    1. Advertising

  3. Bob Doe

    James Kanze Guest

    On Nov 14, 10:24 pm, Bob Doe <> 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<>:eek:perator[]?
    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:
    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
     
    James Kanze, Nov 14, 2008
    #3
  4. Bob Doe

    James Kanze Guest

    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 <> 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:
    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
     
    James Kanze, Nov 15, 2008
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Rakesh Sinha
    Replies:
    4
    Views:
    1,855
    Rakesh Sinha
    Jan 13, 2005
  2. Dave
    Replies:
    10
    Views:
    35,314
    Ron Natalie
    May 22, 2005
  3. Javier
    Replies:
    2
    Views:
    574
    James Kanze
    Sep 4, 2007
  4. George2
    Replies:
    10
    Views:
    606
    Pete Becker
    Dec 17, 2007
  5. er
    Replies:
    3
    Views:
    386
Loading...

Share This Page