C ++将派生类shared_ptr传递给模板化函数

时间:2011-03-22 00:29:26

标签: c++ templates inheritance boost shared-ptr

首先应该起作用的东西,然后是不起作用的东西。为什么不是这个问题。

我宣布了两个类:

class Base { ... };
class Derived : public Base { ... };

然后我在其他地方有以下功能:

void foo(shared_ptr<Base> base);   

以下代码应该可以正常使用吗?

share_ptr<Derived> derived;
foo(derived);

现在,忘记上面的内容,我宣布了三个类:

class Foo { ... };
template <typename TYPE> class Base { ... };
class Derived : public Base<Foo> { ... };

在其他地方,我宣布一个模板化的函数:

template <typename TYPE> void foo(shared_ptr<Base<TYPE> > base); 

以下代码不起作用:

shared_ptr<Derived> derived;
foo(derived);

它表示找不到匹配函数foo(...)接受share_ptr<Derived>

首先,原始示例应该有效吗?第二,你认为在第二个例子中我有一个shared_ptr到一个派生自专门基类的类的问题。

2 个答案:

答案 0 :(得分:1)

我认为编译器不会以这种方式通过间接级别。相反,您可以使用TYPE设置为Foo显式实例化foo。例如,以下通过g ++编译:

#include<boost/shared_ptr.hpp>

class Foo {};
template <typename T> class Base {};
class Derived : public Base<Foo> {};

template<typename T>
int foo(boost::shared_ptr<Base<T> > base) {return 0;}

boost::shared_ptr<Derived> derived;
int t = foo<Foo>(derived);

int main() {return 0;}

答案 1 :(得分:0)

这可能是复制和粘贴错误,但只是为了覆盖所有基础,您错过了share_ptr<Derived>的'共享'中的'd'。