Der Visual Studio 2013 Compiler behandelt den folgenden Code ganz gut, aber klirren 5.0 und 6.2 gibt mir einen Linker-Fehler:Clang Linker-Fehler, wenn abstrakte Betreiber Überlastung =
#include <memory>
using namespace::std;
class IBase
{
public:
virtual IBase& operator=(const IBase& other) = 0;
};
class Base : virtual public IBase
{
public:
Base& operator=(const IBase& other) override
{
const Base& b = dynamic_cast<const Base&>(other);
return *this = b;
}
virtual Base& operator=(const Base& other)
{
return *this;
}
};
class IDerived : virtual public IBase
{
};
class Derived : public IDerived, public Base
{
public:
using Base::operator=;
};
int main(int argc, const char * argv[]) {
shared_ptr<Derived> d1 = make_shared<Derived>();
shared_ptr<Derived> d2 = make_shared<Derived>();
*d2 = *d1;
}
Hier ist die Build-Log-Ausgabe:
Ld /Users/Jennifer/Library/Developer/Xcode/DerivedData/Operator-bjjgcoxcziyegjgmazknrandutqz/Build/Products/Debug/Oper normal x86_64
cd /Users/Jennifer/Documents/Operator
export MACOSX_DEPLOYMENT_TARGET=10.9
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -L/Users/Jennifer/Library/Developer/Xcode/DerivedData/Operator-bjjgcoxcziyegjgmazknrandutqz/Build/Products/Debug -F/Users/Jennifer/Library/Developer/Xcode/DerivedData/Operator-bjjgcoxcziyegjgmazknrandutqz/Build/Products/Debug -filelist /Users/Jennifer/Library/Developer/Xcode/DerivedData/Operator-bjjgcoxcziyegjgmazknrandutqz/Build/Intermediates/Operator.build/Debug/Oper.build/Objects-normal/x86_64/Oper.LinkFileList -mmacosx-version-min=10.9 -stdlib=libc++ -Xlinker -dependency_info -Xlinker /Users/Jennifer/Library/Developer/Xcode/DerivedData/Operator-bjjgcoxcziyegjgmazknrandutqz/Build/Intermediates/Operator.build/Debug/Oper.build/Objects-normal/x86_64/Oper_dependency_info.dat -o /Users/Jennifer/Library/Developer/Xcode/DerivedData/Operator-bjjgcoxcziyegjgmazknrandutqz/Build/Products/Debug/Oper
Undefined symbols for architecture x86_64:
"IBase::operator=(IBase const&)", referenced from:
IDerived::operator=(IDerived const&) in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
IBase::operator=(IBase const&)
wird in Base
welche Derived
erbt von definierten und Derived
using Base::operator=
ist es so sollte fürdefiniert werden,, nicht vom Standardzuweisungsoperator überschrieben. Eine Lösung, die ich fand, war die IBase::operator=
Methode zu entfernen, aber das ist nicht ideal, da es eine Methode ist, die jede erbende Klasse implementieren müsste.
Weiß jemand, was der Unterschied ist und wie man es beheben kann? Ich möchte die Methode IBase::operator=
wenn möglich beibehalten.
Bezüglich des ersten Absatzes in der Antwort, kann es sich lohnen, klarzustellen, dass selbst wenn die using-Deklaration eine Deklaration mit dem richtigen Parameter typ hat e, es würde die implizite Deklaration des Kopierzuweisungsoperators immer noch nicht unterdrücken. – bogdan
@bogdan danke, ich habe diesen Teil vergessen. – ecatmur