VisualStudio 2013 kompilator obsługuje następujący kod dobrze, ale Clang 5.0 i 6.2 daje mi błąd linkera:błąd linkera Clang gdy przeciążenia streszczenie operatora =
#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;
}
oto wyjście dziennika budowy:
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&)
jest zdefiniowana w Base
które Derived
dziedziczy i Derived
jest using Base::operator=
więc powinna być określona dla Derived
, nie zastąpiony przez domyślny operator przypisania.
Jednym z rozwiązań, które znalazłem, było usunięcie metody IBase::operator=
, ale nie jest to idealne rozwiązanie, ponieważ jest to metoda, którą powinna zaimplementować każda dziedzicząca klasa.
Czy ktoś wie, co to jest różnica i jak to naprawić? Jeśli to możliwe, chciałbym zachować metodę IBase::operator=
.
Odnośnie do pierwszego akapitu w odpowiedzi, warto wyjaśnić, że nawet jeśli deklaracja użycia przyniosła deklarację z właściwym parametrem e, to nadal nie powstrzymałoby domyślnej deklaracji operatora przydziału kopiowania. – bogdan
@bogdan dzięki, zapomniałem tej części. – ecatmur