Otrzymuję błąd linkera w moim kodzie. Zauważyłem to do podstawowych rzeczy poniżej.Błąd łącznika "vtable" (z udziałem destruktora wirtualnego z "= default") - potencjalny błąd w Clang 3.1?
Ten kod daje błąd linkera "vtable dla Foo", odwołuje się od: Foo :: Foo()
class Foo {
public:
Foo();
virtual ~Foo() = default;
};
Foo::Foo() { }
ale ten kod nie daje żadnych błędów:
class Foo {
public:
Foo();
virtual ~Foo() { }
};
Foo::Foo() { }
Dlaczego? Myślałem, że = default
miał w zasadzie zrobić to samo, co puste nawiasy kwadratowe.
Aktualizacja: Używam "Kompilatora Apple LLVM 4.1", część Xcode 4.5.2. Czy może to być błąd w tym kompilatorze? Być może działa na najnowszym GCC (którego Apple już nie wysyła). Zobacz poniżej komentarze do dyskusji na temat kompilatorów.
Aktualizacja 2: Jak omówiono poniżej, zmiana linii na virtual inline ~Foo() = default;
usuwa ten błąd. Czy to po prostu ma jako błąd? Wygląda na to, że kompilator nie rozpoznaje funkcji wstawiania w tym przypadku bez jawnego napisania inline
.
Wypróbuj 'virtual ~ Foo() noexcept = default;'. Myślę, że kiedyś miałem podobny problem i zrezygnowałem z "domyślnego". Co więcej, myślę, że w tym jest nawet DR. –
Błąd @KerrekSB Linker nadal występuje z 'noexcept'. –
Działa to dla mnie z gcc 4.7.2. – Kocka