Jump to content
  • Advertisement
Sign in to follow this  
KingofNoobs

unique_ptr private member

This topic is 2052 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hello,

Can someone tell me why line (1) does not generate a compiler error while line (2) does?

mAtlasList.push_back(std::unique_ptr<Atlas>(new Atlas(MASTER_ATLAS_MAINMENU)) );
(1)mAtlasList.begin()->operator*().GetName();
(2)auto IsLevel1Atlas = [](std::unique_ptr<Atlas> atlas) -> bool { return atlas->GetName() == L"Level1Atlas"; };
auto tempAtlasPtr = std::find_if(mAtlasList.begin(), mAtlasList.end(), IsLevel1Atlas);
const Sprite * tempSpritePtr = &(tempAtlasPtr->operator*().GetSpriteList().find(L"Background")->second);

The error generated is: error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'

Thanks.

Share this post


Link to post
Share on other sites
Advertisement
IsLevel1Atlas's parameter is a value of unique_ptr, you can't copy a unique_ptr.
Change IsLevel1Atlas to
auto IsLevel1Atlas = [](const std::unique_ptr<Atlas> & atlas) -> bool { return atlas->GetName() == L"Level1Atlas"; };

The first one works I guess your list::push_back must implement rvalue reference (&&) version? Edited by wqking

Share this post


Link to post
Share on other sites
Hello again,

Is something like this possible? I am getting the same error here, which leads me to believe that a vector<unique_ptr<somethin> > is not possible:

const Rect GetSourceRect(const std::unique_ptr<Animation>& currentAnimation, uint32_t frameNumInAnimation) const
{
// Calculate position of current animation frame
auto i = std::find(mAnimations.begin(), mAnimations.end(), currentAnimation); // error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'

As you can see I passed the unique_ptr as a const &, but when I use algorithms, there appear to be copies being made here and there. Is there a solution to this?

Thanks,

-Dave Ottley Edited by KingofNoobs

Share this post


Link to post
Share on other sites
BitMaster,

Sorry about that. I have edited the post above. Also, the error is:

error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'

Share this post


Link to post
Share on other sites
Without knowing the details it is not possible to be sure but does a comparison like
(instance of std::unique_ptr<somethin>) == (instance of std::unique_ptr<Animation>)
make sense at all? You might have to define a custom predicate for whatever it is you want and use std::find_if.

On a sidenote, the error is still not complete the output will contain a few more lines after the actual error codes to define exactly what kind of types T is in each case.

Share this post


Link to post
Share on other sites
The original problem was that I was having to default construct animations. For my game, animations come out of a file called an "atlas" file. There should be no way to default construct either an atlas or a sprite, or an animation (the ordering is atlas->sprite->animation, each one owning one or more of the item following it on the list). Thus, when I want to create a SpriteInstance, I have to pass a "starting animation" but rather than default construct one and fill in the fields by hand, I want to force myself to use the "unique" and only copy instantiated by the file. So I thought that changing the atlas and sprite classes to hold pointers to animations rather than animations themselves, that I could solve this problem. Wanting to avoid memory leaks, I thought I would go with the unique_ptr, however, I'm not sure if it is possible given the current errors. I think it should be but don't want to waste too much time on the issue, when I could just use raw pointers and delete.

The full error is below:

error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
1> with
1> [
1> _Ty=Animation
1> ]
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\memory(1447) : see declaration of 'std::unique_ptr<_Ty>::unique_ptr'
1> with
1> [
1> _Ty=Animation
1> ]
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\xmemory0(605) : while compiling class template member function 'void std::allocator<_Ty>::construct(_Ty *,const _Ty &)'
1> with
1> [
1> _Ty=std::unique_ptr<Animation>
1> ]
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\xmemory0(751) : see reference to function template instantiation 'void std::allocator<_Ty>::construct(_Ty *,const _Ty &)' being compiled
1> with
1> [
1> _Ty=std::unique_ptr<Animation>
1> ]
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include ype_traits(743) : see reference to class template instantiation 'std::allocator<_Ty>' being compiled
1> with
1> [
1> _Ty=std::unique_ptr<Animation>
1> ]
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\vector(655) : see reference to class template instantiation 'std::is_empty<_Ty>' being compiled
1> with
1> [
1> _Ty=std::allocator<std::unique_ptr<Animation>>
1> ]
1> c:\users\mrmerchantman\dropbox\zzz_c++\projects\blockbuster\source\graphics\sprite.h(37) : see reference to class template instantiation 'std::vector<_Ty>' being compiled
1> with
1> [
1> _Ty=std::unique_ptr<Animation>

Share this post


Link to post
Share on other sites
I just want to point out that this

mAtlasList.push_back(std::unique_ptr<Atlas>(new Atlas(MASTER_ATLAS_MAINMENU)) );

should be

mAtlasList.push_back( std::move( std::unique_ptr<Atlas>(new Atlas(MASTER_ATLAS_MAINMENU)) ) );

But if you really are trying to pass around multiple smart pointers to the same object you should use shared_ptr

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!