Korzystanie CRTP czasami napisać kod jak poniżej:Jak uniknąć błędów podczas korzystania z protokołu CRTP?
// this was written first
struct Foo : Base<Foo, ...>
{
...
};
// this was copy-pasted from Foo some days later
struct Bar : Base<Foo, ...>
{
...
};
I to jest bardzo trudne do zrozumienia tego, co idzie źle, dopóki nie kod śledzenia debugger i zobaczyć, że członkowie bar nie są wykorzystywane w Base
.
Jak ujawnić ten błąd podczas kompilacji?
(używam MSVC2010, więc mogę korzystać z niektórych C++ 0x funkcje i rozszerzenia języka msvc)
w rzeczywistości nie działa, jeśli dtor nigdy nie jest wywoływany. – Abyx
@Abyx: Interesująco z gcc 4.9, jeśli używam miejsca docelowego new do skonstruowania obiektu typu 'struct S: base {}', to narzeka na to, że * konstruktor * 'S :: S()' jest niejawnie usuwany z powodu '~ base' jest prywatne. Jednak w tym przypadku destruktor nigdy nie jest wywoływany. –
Co ciekawsze, gcc 4.8.1 w ogóle nie narzeka! –