2016-04-13 16 views
2

std::enable_shared_from_this<TBASE>'dan özel olarak devralan bir taban sınıfına sahip olmak istiyorum. Ama sonra türetilmiş bir sınıftaki bir nesneye paylaşılan bir işaretçi oluşturmaya çalıştığımda, derleyici std::enable_shared_from_this<TBASE> yapıcı için düz gider ve erişilemez bir taban olarak başarısız olur.Temel sınıflarında std :: enable_shared_from_this kullanma

Aşağıdaki örnek, bir ben Bar içinde belirtebilirsiniz yolu erişilemez shared_ptr kurucusunu kullanmak denemek için değil var mı g ++ 5.2.1

#include <memory> 

class Foo : private std::enable_shared_from_this<Foo> 
{ 
    //... 
}; 

class Bar : public Foo 
{ 
    //... 
}; 

int main() 
{ 
    std::shared_ptr<Bar> spBar(new Bar); 
    return 0; 
} 

üzerine derlenmeyecektir?

g ++ hatadır:

In file included from /usr/include/c++/5/bits/shared_ptr.h:52:0, 
      from /usr/include/c++/5/memory:82, 
      from example.cxx:1: 

/usr/include/c++/5/bits/shared_ptr_base.h: In instantiation of ‘std::__shared_ptr<_Tp, _Lp>::__shared_ptr(_Tp1*) [with _Tp1 = Bar; _Tp = Bar; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’: 

/usr/include/c++/5/bits/shared_ptr.h:117:32: required from ‘std::shared_ptr<_Tp>::shared_ptr(_Tp1*) [with _Tp1 = Bar; _Tp = Bar]’ 

example.cxx:15:39: required from here 

/usr/include/c++/5/bits/shared_ptr_base.h:887:36: error: ‘std::enable_shared_from_this<Foo>’ is an inaccessible base of ‘Bar’ 
__enable_shared_from_this_helper(_M_refcount, __p, __p); 

cevap

3

kamu devralır gerekir düşünüyorum:

#include <memory> 

class Foo : public std::enable_shared_from_this<Foo> 
{ 
private: 
    using std::enable_shared_from_this<Foo>::shared_from_this; 
};  
1

sorun değil Bar olarak, Foo bulunmaktadır. Aşağıdaki program aynı hatayı veriyor.

açıkça size (sadece sınıf içinde görünür) o protected (bütün hiyerarşi whithin görünür) veya private yapabilirsiniz shared_from_this deşifre olmamak için std::enable_shared_from_this<>

#include <memory> 

class Foo : private std::enable_shared_from_this<Foo> 
{ 
    //... 
}; 

class Bar : public Foo 
{ 
    //... 
}; 

int main() 
{ 
    //std::shared_ptr<Bar> spBar(new Bar); 
    std::shared_ptr<Foo> spBar(new Foo); 
    return 0; 
} 
+0

İlginç. Bu nedenle, "private_from_this" işlevini yalnızca özel kullanım için etkinleştirmenin bir yolu yok mu? – jaw

+0

Ben stdlib ile ++ ve libc'nizdeki ile ++ ben clang aynı sorunu teyit böylece (3.5.0) – max66

+0

sanmıyorum ++ – max66

İlgili konular