Próbuję napisać CRTP, aby zawierać static constexpr
typu pochodnego, ponieważ nie można tego zrobić z tylko jedną klasą. Ten kod kompiluje się dobrze w GCC, ale clang narzeka, że Derived
jest niekompletnym typem. Który jest poprawny?Czy definicja klasy jest kompletna, gdy jest przekazywana do klasy bazowej?
template<class T>
class Base {
public:
static constexpr T a = T(1), b = T(20);
};
class Derived : public Base<Derived> {
public:
int x;
constexpr Derived(int x) : x(x) {}
};
Bądź ostrożny przy konstruktorze Derived, lokalna zmienna x, a element członkowski ma tę samą nazwę. – Brahim
Chcę tylko podkreślić, że zachowanie obiektów pochodnych jako statycznych wewnątrz klasy bazowej nie jest najlepszym pomysłem .. –
Jedynym powodem, dla którego to zrobiono w ten sposób, ponieważ nie mogę wstawić 'static constexpr' typu' Derived' do 'Derived'. Chciałem to zrobić: 'Derived :: a' zamiast czegoś takiego jak' Derived :: constants :: a'. – user975989