ich den folgenden Linkfehler mit dem folgenden Code erhalten:Wie gegen eine überlastetes Template-Methode verknüpfen
undefined reference to
Ibase :: Name() const'`
Hinweis in der Basisklasse, ist es die virtuelle Aufruf Funktionsname(). Die Implementierung der Klasse Name der abgeleiteten Klasse soll aufgerufen werden, der Linker sucht jedoch nach IBase :: Name, nicht nach Derived :: Name(). Wie löst man das?
template<class T_Extendable>
class IBase
{
public:
virtual ~IBase() = default;
virtual const std::string& Name() const = 0;
};
template<class T_Extendable>
class Base : public IBase<T_Extendable>
{
public:
virtual ~Base() { "Destructing " << Name(); } // use virtual function Name()
};
class Derived : public Base<Foo>
{
public:
virtual ~Derived() = default;
const std::string& Name() const final { return "Derived"; } // implement pure virtual method IBase::Name()
};
'const std :: Zeichenfolge & Name() const final {return" Derived "; } 'ist ein Rezept für eine Katastrophe. Ihr Compiler sollte Sie warnen, dass Sie einen Verweis auf ein temporäres Objekt zurückgeben, und sehen Sie nach, was das bedeutet. – Praetorian
Liebe Liebe stackoverflow! Natürlich sieht das nicht nach unserem Produktionscode aus, sondern wurde destilliert, um das Problem zu kommunizieren. Ich denke, Smeehey hat etwas dagegen. – rkemp