C ++ передает производный класс shared_ptr в шаблонную функцию - PullRequest
2 голосов
/ 22 марта 2011

Сначала то, что должно работать, потом то, что не работает. Почему это не вопрос.

Я объявляю два класса:

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 ]

1 голос
/ 22 марта 2011

Я не думаю, что компилятор пройдет через уровень косвенности таким образом. Скорее, вы можете явно создать экземпляр foo, установив для TYPE значение 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;}
0 голосов
/ 22 марта 2011

Это может быть ошибка копирования и вставки, но чтобы охватить все базы, вы пропустили «d» в «shared» для share_ptr<Derived>.

...