这是一个简化的示例:
#include <memory>
#include <vector>
template< class T >
class K
{
public:
virtual ~K(){}
};
class KBOUM : public K<int>{};
template< class U >
void do_something( std::shared_ptr< K<U> > k ) { }
int main()
{
auto kboom = std::make_shared<KBOUM>();
do_something( kboom ); // 1 : error
std::shared_ptr< K<int> > k = kboom; // 2 : ok
do_something( k ); // 3 : ok
}
无论是否使用 boost,无论我使用什么编译器,我都会在 #1 上收到错误,因为shared_ptr<KBOOM>
不继承自shared_ptr<K<int>>
. 但是,KBOOM
确实继承自K<int>
. 您可以看到 #2 有效,因为 shared_ptr 旨在允许将子类指针隐式传递给基类指针,就像原始指针一样。
所以我的问题是:
- 是什么阻止了 std::shared_ptr 实现者使其在案例 #1 中工作(我的意思是,假设标准确实阻止了这种情况,应该有原因);
- 有没有办法在
auto kboom = std::make_shared<KBOUM>(); do_something( kboom );
不从 KBOOM 继承的 K 中查找 int 类型的情况下进行编写?
注意:我想避免函数的用户必须编写
std::shared_ptr<K<int>> k = std::make_shared<KBOOM>();
或者
do_something( std::shared_ptr<K<int>>( kboom ) );