set<const int> - does not compile

Discussion in 'C++' started by chrisstankevitz@yahoo.com, Dec 9, 2005.

  1. Guest

    This code does not compile on gcc 3.4.4. Should it?

    Thanks for your help,

    Chris

    //================
    #include <set>

    int main()
    {
    std::set<const int> s;

    s.insert(3);

    return 0;
    }

    //================

    [cstankevitz@maggie temp]$ g++ --version
    g++ (GCC) 3.4.4 20050721 (Red Hat 3.4.4-2)
    Copyright (C) 2004 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions. There is
    NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
    PURPOSE.
    [cstankevitz@maggie temp]$ g++ temp.cpp
    /usr/lib/gcc/x86_64-redhat-linux/3.4.4/../../../../include/c++/3.4.4/ext/new_all
    ocator.h: In instantiation of `__gnu_cxx::new_allocator<const int>':
    /usr/lib/gcc/x86_64-redhat-linux/3.4.4/../../../../include/c++/3.4.4/bits/alloca
    tor.h:81: instantiated from `std::allocator<const int>'
    /usr/lib/gcc/x86_64-redhat-linux/3.4.4/../../../../include/c++/3.4.4/bits/stl_tr
    ee.h:329: instantiated from `std::_Rb_tree<const int, const int,
    std::_Identit
    y<const int>, std::less<const int>, std::allocator<const int> >'
    /usr/lib/gcc/x86_64-redhat-linux/3.4.4/../../../../include/c++/3.4.4/bits/stl_se
    t.h:127: instantiated from `std::set<const int, std::less<const int>,
    std::all
    ocator<const int> >'
    temp.cpp:5: instantiated from here
    /usr/lib/gcc/x86_64-redhat-linux/3.4.4/../../../../include/c++/3.4.4/ext/new_all
    ocator.h:75: error: `const _Tp*
    __gnu_cxx::new_allocator<_Tp>::address(const _Tp
    &) const [with _Tp = const int]' and `_Tp*
    __gnu_cxx::new_allocator<_Tp>::addres
    s(_Tp&) const [with _Tp = const int]' cannot be overloaded
    /usr/lib/gcc/x86_64-redhat-linux/3.4.4/../../../../include/c++/3.4.4/bits/stl_fu
    nction.h: In instantiation of `std::_Identity<const int>':
    /usr/lib/gcc/x86_64-redhat-linux/3.4.4/../../../../include/c++/3.4.4/bits/stl_tr
    ee.h:871: instantiated from `std::pair<typename std::_Rb_tree<_Key,
    _Val, _Key
    OfValue, _Compare, _Alloc>::iterator, bool> std::_Rb_tree<_Key, _Val,
    _KeyOfValu
    e, _Compare, _Alloc>::insert_unique(const _Val&) [with _Key = const
    int, _Val =
    const int, _KeyOfValue = std::_Identity<const int>, _Compare =
    std::less<const i
    nt>, _Alloc = std::allocator<const int>]'
    /usr/lib/gcc/x86_64-redhat-linux/3.4.4/../../../../include/c++/3.4.4/bits/stl_se
    t.h:314: instantiated from `std::pair<typename std::_Rb_tree<_Key,
    _Key, std::
    _Identity<_Key>, _Compare, _Alloc>::const_iterator, bool>
    std::set<_Key, _Compar
    e, _Alloc>::insert(const _Key&) [with _Key = const int, _Compare =
    std::less<con
    st int>, _Alloc = std::allocator<const int>]'
    temp.cpp:7: instantiated from here
    /usr/lib/gcc/x86_64-redhat-linux/3.4.4/../../../../include/c++/3.4.4/bits/stl_fu
    nction.h:538: error: `const _Tp& std::_Identity<_Tp>::eek:perator()(const
    _Tp&) con
    st [with _Tp = const int]' and `_Tp&
    std::_Identity<_Tp>::eek:perator()(_Tp&) const
    [with _Tp = const int]' cannot be overloaded
    /usr/lib/gcc/x86_64-redhat-linux/3.4.4/../../../../include/c++/3.4.4/bits/stl_co
    nstruct.h: In function `void std::_Construct(_T1*, const _T2&) [with
    _T1 = const
    int, _T2 = int]':
    /usr/lib/gcc/x86_64-redhat-linux/3.4.4/../../../../include/c++/3.4.4/bits/stl_tr
    ee.h:367: instantiated from `std::_Rb_tree_node<_Val>*
    std::_Rb_tree<_Key, _Va
    l, _KeyOfValue, _Compare, _Alloc>::_M_create_node(const _Val&) [with
    _Key = cons
    t int, _Val = const int, _KeyOfValue = std::_Identity<const int>,
    _Compare = std
    ::less<const int>, _Alloc = std::allocator<const int>]'
    /usr/lib/gcc/x86_64-redhat-linux/3.4.4/../../../../include/c++/3.4.4/bits/stl_tr
    ee.h:783: instantiated from `typename std::_Rb_tree<_Key, _Val,
    _KeyOfValue, _
    Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue,
    _Compare, _All
    oc>::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*,
    const _Val&)
    [with _Key = const int, _Val = const int, _KeyOfValue =
    std::_Identity<const int
    >, _Compare = std::less<const int>, _Alloc = std::allocator<const int>]'

    /usr/lib/gcc/x86_64-redhat-linux/3.4.4/../../../../include/c++/3.4.4/bits/stl_tr
    ee.h:877: instantiated from `std::pair<typename std::_Rb_tree<_Key,
    _Val, _Key
    OfValue, _Compare, _Alloc>::iterator, bool> std::_Rb_tree<_Key, _Val,
    _KeyOfValu
    e, _Compare, _Alloc>::insert_unique(const _Val&) [with _Key = const
    int, _Val =
    const int, _KeyOfValue = std::_Identity<const int>, _Compare =
    std::less<const i
    nt>, _Alloc = std::allocator<const int>]'
    /usr/lib/gcc/x86_64-redhat-linux/3.4.4/../../../../include/c++/3.4.4/bits/stl_se
    t.h:314: instantiated from `std::pair<typename std::_Rb_tree<_Key,
    _Key, std::
    _Identity<_Key>, _Compare, _Alloc>::const_iterator, bool>
    std::set<_Key, _Compar
    e, _Alloc>::insert(const _Key&) [with _Key = const int, _Compare =
    std::less<con
    st int>, _Alloc = std::allocator<const int>]'
    temp.cpp:7: instantiated from here
    /usr/lib/gcc/x86_64-redhat-linux/3.4.4/../../../../include/c++/3.4.4/bits/stl_co
    nstruct.h:81: error: invalid static_cast from type `const int*' to type
    `void*'
     
    , Dec 9, 2005
    #1
    1. Advertising

  2. Guest

    wrote:
    > This code does not compile on gcc 3.4.4. Should it?


    Since contents of an stl container must be assignable I wouldn't think
    so.

    > std::set<const int> s;
     
    , Dec 9, 2005
    #2
    1. Advertising

  3. Guest

    Thanks for your reply.

    Do you know what is the rationale behind the requirement "the contents
    of an stl container must be assignable"?

    I can understand this requirement for vectors (which copy elements as
    they grow), but not for other containers like the linked list and set.
    I'm suprised I never heard this requirement. I can't find any
    reference to it in Stroustrup's or Josuttis's books.

    Thanks for your help,

    Chris
     
    , Dec 9, 2005
    #3
  4. Guest

    I see it now:

    Josuttis section 5.10.1:
    An element must be assignable by the assignment operator.

    Thanks,

    Chris
     
    , Dec 9, 2005
    #4
  5. Guest

    wrote:
    > Thanks for your reply.
    >
    > Do you know what is the rationale behind the requirement "the contents
    > of an stl container must be assignable"?


    Well, many operations on a list assign values. Creating a list that
    doesn't would require a special case in which many of std::list's
    operations would be invalid and even more would need drastic changes.
    If you really need this type of thing you'll have to create it in a
    container of your own design.
     
    , Dec 9, 2005
    #5
    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. Timo Freiberger
    Replies:
    3
    Views:
    994
    Bob Hairgrove
    Oct 30, 2004
  2. ThazKool
    Replies:
    1
    Views:
    460
  3. Replies:
    11
    Views:
    1,151
  4. Javier
    Replies:
    2
    Views:
    620
    James Kanze
    Sep 4, 2007
  5. 0m
    Replies:
    26
    Views:
    1,171
    Tim Rentsch
    Nov 10, 2008
Loading...

Share This Page