2 Stimmen

C++ Übergabe einer abgeleiteten Klasse shared_ptr an eine Schablonenfunktion

Erst etwas, das funktionieren sollte, dann etwas, das nicht funktioniert. Warum funktioniert es nicht, ist die Frage.

Ich melde zwei Klassen an:

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

Ich habe dann an anderer Stelle die folgende Funktion:

void foo(shared_ptr<Base> base);   

Der folgende Code sollte funktionieren, oder?

share_ptr<Derived> derived;
foo(derived);

Vergessen Sie das oben Gesagte, ich deklariere drei Klassen:

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

An anderer Stelle deklariere ich eine Schablonenfunktion:

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

Der folgende Code funktioniert nicht:

shared_ptr<Derived> derived;
foo(derived);

Es wird gesagt, dass keine passende Funktion foo(...) gefunden wurde, die Folgendes akzeptiert share_ptr<Derived>

Erstens: Sollte das ursprüngliche Beispiel funktionieren? Und zweitens, was denken Sie, könnte das Problem im zweiten Beispiel sein, wo ich eine shared_ptr zu einer Klasse, die von einer spezialisierten Basisklasse abgeleitet ist.

1voto

Johnny Graettinger Punkte 1078

Ich glaube nicht, dass der Compiler auf diese Weise eine indirekte Ebene durchlaufen wird. Stattdessen können Sie foo explizit mit TYPE auf Foo setzen. Z.B. kompiliert das Folgende über 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;}

0voto

Karl Bielefeldt Punkte 45032

Es könnte sich um einen Kopier- und Einfügefehler handeln, aber nur um alles abzudecken, haben Sie das "d" in "shared" für share_ptr<Derived> .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X