-
January 21st, 2021, 07:41 AM
#1
Compiler error 3848
I'm updating some code that previously built okay with VS2005:-
Code:
struct id_compare
{
bool operator()(const boost::shared_ptr<Playlist>& p1, const boost::shared_ptr<Playlist>& p2)
{
return p1->id () < p2->id ();
}
};
typedef std::set<boost::shared_ptr<Playlist> > List;
typedef std::set<boost::shared_ptr<Playlist>, id_compare> IDSortedList;
static void
get_id_sorted_playlists (const List& playlists, IDSortedList& id_sorted_playlists)
{
for (List::const_iterator i = playlists.begin(); i != playlists.end(); ++i) {
id_sorted_playlists.insert(*i); // <--- COMPILER ERROR C3848 HERE !!!!
}
}
but VS2019 gives me this error at the above line:-
error C3848: expression having type 'const id_compare' would lose some const-volatile qualifiers in order to call 'bool id_compare: perator ()(const boost::shared_ptr<ARDOUR::Playlist> &,const boost::shared_ptr<ARDOUR::Playlist> &)'
message : see reference to function template instantiation 'std::_Tree_find_result<std::_Tree_node<boost::shared_ptr<ARDOUR::Playlist>,std::_Default_allocator_traits<_Alloc>::void_pointer> *> std::_Tree<std::_Tset_traits<_Kty,_Pr,_Alloc,false>>::_Find_lower_bound<_Key>(const _Keyty &) const' being compiled
with
[
_Alloc=std::allocator<boost::shared_ptr<ARDOUR::Playlist>>,
_Kty=boost::shared_ptr<ARDOUR::Playlist>,
_Pr=id_compare,
_Key=boost::shared_ptr<ARDOUR::Playlist>,
_Keyty=boost::shared_ptr<ARDOUR::Playlist>
]
Can anyone see a problem with the above code? Or is it likely to be some kind of issue with the supplier (Playlist) object?
"A problem well stated is a problem half solved.” - Charles F. Kettering
-
January 21st, 2021, 07:55 AM
#2
Re: Compiler error 3848
I suspect that .insert() doesn't want a const argument. Try making i ::iterator instead of ::const_iterator. Also, as .begin()/.end() are used rather than .cbegin()/.cend(), then the type should be ::iterator.
There's lots of things that VS2005 compiled (as C++98!) that weren't right but weren't complained about! Back then VS was very lax about what was correct and what wasn't! This changed when they re-wrote there compiler front-end. VS is much more standard compliant now.
All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!
C++23 Compiler: Microsoft VS2022 (17.6.5)
-
January 21st, 2021, 09:18 AM
#3
Re: Compiler error 3848
Thanks 2kaud - I tried removing const and also changing to cbegin() / cend() etc but nothing seemed to help.
For testing purposes I've now changed to very simple types but with a simple list of ints, I'm now seeing compiler error C2664 at the same line :-
Code:
typedef std::list<int> my_ints;
struct id_compare
{
bool operator()(const boost::shared_ptr<int>& p1, const boost::shared_ptr<int>& p2)
{
return p1 < p2;
}
};
typedef std::set<boost::shared_ptr<my_ints> > List;
typedef std::set<boost::shared_ptr<my_ints>, id_compare> IDSortedList;
static void
get_id_sorted_ints(my_ints& ints, IDSortedList& id_sorted_ints)
{
for (my_ints::iterator i = ints.begin(); i != ints.end(); ++i) {
id_sorted_ints.insert(*i); // <--- COMPILE ERROR 2664 NOW !!!!
}
}
There's something I'm just not seeing here...
"A problem well stated is a problem half solved.” - Charles F. Kettering
-
January 21st, 2021, 10:52 AM
#4
Re: Compiler error 3848
I'm not sure what's happening in the original code - but in my simplified version...
Code:
id_sorted_ints.insert(*i);
insert() seems to be expecting a std::initializer_list rather than an int
So how should I add an int to the set of ints
"A problem well stated is a problem half solved.” - Charles F. Kettering
-
January 21st, 2021, 12:17 PM
#5
Re: Compiler error 3848
Going back to the original problem, I just modified the code and realised something...
Code:
static void
get_id_sorted_playlists (const List& playlists, IDSortedList& id_sorted_playlists)
{
for (List::iterator i = playlists.begin(); i != playlists.end(); ++i) {
const boost::shared_ptr<Playlist> xx = *i;
boost::shared_ptr<Playlist> yy = *i;
id_sorted_playlists.insert(xx); // <--- FAILS TO COMPILE !!!
id_sorted_playlists.insert(yy); // <--- ALSO FAILS TO COMPILE !!!
}
As you can see, I can allocate *i to either a const or non-const boost::shared_ptr<Playlist> - BUT - neither of them can subsequently get passed to IDSortedList::insert() (i.e. std::set::insert() rejects them both). Furthermore... if I remove the various const modifiers (in the original code) that doesn't help. This is starting to look like an incompatibility between boost::shared_ptr and VS2019's std::set
Last edited by John E; January 21st, 2021 at 12:25 PM.
"A problem well stated is a problem half solved.” - Charles F. Kettering
-
January 21st, 2021, 12:57 PM
#6
Re: Compiler error 3848
Re post #3.
You're not inserting an int to a set of int. The set isn't a set of int - but a set of shared_ptr<list<int>> - which is a very different animal!
What's with all the shared_ptr??
The id_comp() function isn't right either - as the 2 args are actually list<int>, not int. Don't forget that IDSortedList is at it's basics a set of list<int> - so it maintains unique ::list, so the compare has to compare each list and return true/false if list p1 < list p2 - not int p1 < int p2.
The .insert() needs to insert a ::list<int> type, not an int.
How this compiled originally, I don't know.
Something is not right.
All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!
C++23 Compiler: Microsoft VS2022 (17.6.5)
-
January 22nd, 2021, 04:36 AM
#7
Re: Compiler error 3848
Just a quick question. You are using the latest version of boost when compiling with VS2019 - not the old version used with VS005?
I don't know/use boost, but looking again at the code in post #3
Code:
typedef std::set<boost::shared_ptr<my_ints>, id_compare> IDSortedList;
Isn't IDSortedList a set of shared pointers? Therefore shouldn't the insert be a shared pointer - or does boost::shared_ptr have some special overload that allows a value to be converted to a ptr?
All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!
C++23 Compiler: Microsoft VS2022 (17.6.5)
-
January 22nd, 2021, 06:07 AM
#8
Re: Compiler error 3848
Originally Posted by 2kaud
I don't know/use boost, but looking again at the code in post #3
Code:
typedef std::set<boost::shared_ptr<my_ints>, id_compare> IDSortedList;
Isn't IDSortedList a set of shared pointers? Therefore shouldn't the insert be a shared pointer - or does boost::shared_ptr have some special overload that allows a value to be converted to a ptr?
Yesterday I tried removing the Playlist elements and replacing them with a simpler type (int) - but I was quite tired by that stage! I did make it work eventually - but only by removing the boost stuff...
Originally Posted by 2kaud
Just a quick question. You are using the latest version of boost when compiling with VS2019 - not the old version used with VS005?
Yes - it's still the older version but it's fairly recent (I'm using v1.71 and the latest is v1.74). I guess it might be worthwhile updating though. Thanks for the suggestion...
"A problem well stated is a problem half solved.” - Charles F. Kettering
-
January 22nd, 2021, 10:48 AM
#9
Re: Compiler error 3848
I found a list of useful solutions at Stackoverflow.
Solution #4 is the older version that uses a struct (essentially what used to work okay with VS2005). And solution #5 uses std::integral_constant to create a struct somehow from a boolean function. Bingo!! Solution #5 works for VS2019 !!!
So I'm starting to think that for VS2019, either the older method has been restricted now to only work with basic types - or else it's just plain broken!!
"A problem well stated is a problem half solved.” - Charles F. Kettering
-
January 24th, 2021, 05:55 AM
#10
Re: Compiler error 3848
Thanks for update. I remember this mess now. We went through the conversion from C++98 with VS2012/2013. Nightmare!
re the set comparator. It needs a type (eh!) for the templated parameter. That's why std::integral_constant works as it wraps the value into a templated struct and as a type that can then be used.
Interestingly (???), if you define a lambda you can use the lambda name - but you can't directly use a lambda.
PS Re the original operator() in id_compare, did you try making operator() const?
All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!
C++23 Compiler: Microsoft VS2022 (17.6.5)
-
January 24th, 2021, 12:57 PM
#11
Re: Compiler error 3848
Originally Posted by 2kaud
PS Re the original operator() in id_compare, did you try making operator() const?
I just gave that a try here but it still gives me C3848
Originally Posted by 2kaud
re the set comparator. It needs a type (eh!) for the templated parameter. That's why std::integral_constant works as it wraps the value into a templated struct and as a type that can then be used.
Is that something that needs to get fed back to Microsoft somehow?
"A problem well stated is a problem half solved.” - Charles F. Kettering
-
January 24th, 2021, 02:04 PM
#12
Re: Compiler error 3848
Originally Posted by John E
Is that something that needs to get fed back to Microsoft somehow?
Probably the least painful approach is to incrementally keep production code to the current version or at least cuurent minus 1. Yeah, every few years you have to feel a little pain getting your old code to conform to a new compiler (that is even more c++ standards compliant), but at least it's a little pain, not the pain of converting 15 or 25 year old code.
-
January 25th, 2021, 04:47 AM
#13
Re: Compiler error 3848
Is that something that needs to get fed back to Microsoft somehow?
It's the standard - not MS AFAIK.
The standard changes - and there have been massive changes since C++98. Getting a C++98 solution to compile as C++17 can be an utter nightmare! As Arjay suggests, the least painful way is to keep fairly up-to-date with the compiler version and compile against this. Updating from say C++14 to C++17/20 is no where near as painful as doing it from C++98.
IMO, if you're got code that hasn't compiled OK with at least VS2013, then you're probably going to have issues compiling as VS2019. I'd be wanting to 'check/update' all the code so that it's OK with VS2019. As I said, we went through this pain when we updated to VS2012/13 - and it wasn't nice. Thankfully now updating to the next version seems to be fairly painless.
All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!
C++23 Compiler: Microsoft VS2022 (17.6.5)
-
January 25th, 2021, 10:23 AM
#14
Re: Compiler error 3848
Up to now I think I've updated around 70 support projects which I can now compile with VS2019 - but there've been very few show stoppers. The only previous one I remember was realising that the __asm keyword isn't supported for 64-nit builds (tho' I guess that would've been true, even with my previous version of VC++)
"A problem well stated is a problem half solved.” - Charles F. Kettering
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|