मुझे हाल ही में कई कक्षाओं के लिंक विनिर्देश को बदलना पड़ा और एक समस्या में भाग गया। कक्षाओं में से दो में std::map
std::unique_ptr
के साथ मान प्रकार के रूप में std::map
शामिल हैं। लिंकेज बदलने के बाद संकलक ने शिकायत शुरू कर दी "कक्षा में घोषित निजी सदस्य तक पहुंच नहीं सकते" std :: unique_ptr < _Ty> '' त्रुटियां।"निजी सदस्य तक नहीं पहुंच सकता है" त्रुटि केवल तब होती है जब कक्षा में निर्यात लिंक
कोई भी जानता है कि यह तब होता है जब निर्यात विनिर्देश की आपूर्ति की जाती है या कोई समाधान होता है?
नमूना कोड:
#include <map>
struct SomeInterface
{
virtual ~SomeInterface() = 0;
};
// This class compiles with no problems
struct LocalClass
{
std::map<int, std::unique_ptr<SomeInterface>> mData;
};
// This class fails to compile
struct __declspec(dllexport) ExportedClass
{
std::map<int, std::unique_ptr<SomeInterface>> mData;
};
संकलक उत्पादन:
c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(163): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
with
[
_Ty=SomeInterface
]
c:\program files (x86)\microsoft visual studio 10.0\vc\include\memory(2347) : see declaration of 'std::unique_ptr<_Ty>::unique_ptr'
with
[
_Ty=SomeInterface
]
c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(195) : see reference to function template instantiation 'std::_Pair_base<_Ty1,_Ty2>::_Pair_base<const int&,_Ty2&>(_Other1,_Other2)' being compiled
with
[
_Ty1=const int,
_Ty2=std::unique_ptr<SomeInterface>,
_Other1=const int &,
_Other2=std::unique_ptr<SomeInterface> &
]
c:\program files (x86)\microsoft visual studio 10.0\vc\include\xmemory(208) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2>::pair<const _Kty,_Ty>(std::pair<_Ty1,_Ty2> &)' being compiled
with
[
_Ty1=const int,
_Ty2=std::unique_ptr<SomeInterface>,
_Kty=int,
_Ty=std::unique_ptr<SomeInterface>
]
c:\program files (x86)\microsoft visual studio 10.0\vc\include\xmemory(280) : see reference to function template instantiation 'void std::allocator<_Ty>::construct<std::pair<_Ty1,_Ty2>&>(std::pair<_Ty1,_Ty2> *,_Other)' being compiled
with
[
_Ty=std::pair<const int,std::unique_ptr<SomeInterface>>,
_Ty1=const int,
_Ty2=std::unique_ptr<SomeInterface>,
_Other=std::pair<const int,std::unique_ptr<SomeInterface>> &
]
c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtree(592) : see reference to function template instantiation 'void std::_Cons_val<std::allocator<_Ty>,_Ty,std::pair<_Ty1,_Ty2>&>(_Alloc &,std::pair<_Ty1,_Ty2> *,std::pair<_Ty1,_Ty2>)' being compiled
with
[
_Ty=std::pair<const int,std::unique_ptr<SomeInterface>>,
_Ty1=const int,
_Ty2=std::unique_ptr<SomeInterface>,
_Alloc=std::allocator<std::pair<const int,std::unique_ptr<SomeInterface>>>
]
c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtree(1521) : see reference to function template instantiation 'std::_Tree_nod<_Traits>::_Node *std::_Tree_val<_Traits>::_Buynode<std::pair<_Ty1,_Ty2>&>(_Valty)' being compiled
with
[
_Traits=std::_Tmap_traits<int,std::unique_ptr<SomeInterface>,std::less<int>,std::allocator<std::pair<const int,std::unique_ptr<SomeInterface>>>,false>,
_Ty1=const int,
_Ty2=std::unique_ptr<SomeInterface>,
_Valty=std::pair<const int,std::unique_ptr<SomeInterface>> &
]
c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtree(1516) : while compiling class template member function 'std::_Tree_nod<_Traits>::_Node *std::_Tree<_Traits>::_Copy(std::_Tree_nod<_Traits>::_Node *,std::_Tree_nod<_Traits>::_Node *)'
with
[
_Traits=std::_Tmap_traits<int,std::unique_ptr<SomeInterface>,std::less<int>,std::allocator<std::pair<const int,std::unique_ptr<SomeInterface>>>,false>
]
c:\program files (x86)\microsoft visual studio 10.0\vc\include\map(81) : see reference to class template instantiation 'std::_Tree<_Traits>' being compiled
with
[
_Traits=std::_Tmap_traits<int,std::unique_ptr<SomeInterface>,std::less<int>,std::allocator<std::pair<const int,std::unique_ptr<SomeInterface>>>,false>
]
c:\projects\so\so\so.cpp(18) : see reference to class template instantiation 'std::map<_Kty,_Ty>' being compiled
with
[
_Kty=int,
_Ty=std::unique_ptr<SomeInterface>
]
कम से कम, यह एक पूरी तरह से मंच- और संकलक-विशिष्ट समस्या है। सी ++ में एक मानक एबीआई नहीं है, और * वर्ग * परिभाषा पर '__declspec (declexport)' के प्रभाव पूरी तरह से कंपाइलर तक हैं। –