2014-09-30 100 views
2

我有一個問題。我在玩enable_shared_from_this,注意到一件奇怪的事情。這個例子正常工作:類與結構與enable_shared_from_this

#include <iostream> 
#include <memory> 
using namespace std; 

struct Test : enable_shared_from_this<Test> 
{ 
}; 

int main() { 
    shared_ptr<Test> ptr(new Test); 
    return 0; 
} 

但是,當我改變structclass它停止編譯!

錯誤說:

 
/usr/include/c++/4.8/bits/shared_ptr_base.h:772:58: error: 
‘std::enable_shared_from_this’ is an inaccessible base of ‘Test’ 
    __enable_shared_from_this_helper(_M_refcount, __p, __p); 

有沒有人有一個線索,爲什麼會這樣?

+10

爲'struct'是'public'而對於'class',這是'private'繼承。 – dyp 2014-09-30 15:00:00

+0

沒錯。默認繼承是答案。謝謝! – Jack 2014-09-30 15:09:32

回答

4

這可能是C++標準中的一個(次要)缺陷!

在示例structclass之間的差是基類的缺省可訪問:

struct Test : enable_shared_from_this<Test> 

導出從enable_shared_from_this公開;

class Test : enable_shared_from_this<Test> 

導出從enable_shared_from_this私下;

但是,我找不到標準中的任何(規範)要求,需要enable_shared_from_this基本類別構造 a shared_ptr

[util.smartptr.enab]/6約enable_shared_from_this::shared_from_this()要求:

enable_shared_from_this<T>應可訪問的基類的T

但我看不到標準強制要求使用該函數或任何其他明確要求關於enable_shared_from_this基類的可訪問性。

[util.smartptr.enab]/10-11中給出的可能的實現方式確實需要一個可訪問的基類;所以我認爲規範性部分旨在要求可訪問性。

1

添加默認繼承publicenable_shared_from_this

class Test : public enable_shared_from_this<Test> 
{ 



};