Ich habe die Ursache eines wirklich seltsamen Fehlers in meinem Programm gesucht. Ich habe festgestellt, dass der Basisklassenkonstruktor aus irgendeinem Grund nicht aufgerufen wird. Hier ist der Code zu reproduzieren:Basisklassenkonstruktor nicht aufgerufen?
In meinem Fall stürzt das Programm einfach ab oder druckt zufällige Werte.
Wenn ich das Kind Klasse dies zu ändern, wird der Konstruktor aufgerufen:
template<typename T>
struct Child : T {
Child() = default;
};
Das Gleiche gilt für das, wird der Konstruktor noch genannt:
template<typename T>
struct Child : T {
Child() {}
// Will obviously not call this one
template<typename... Args, std::enable_if_t<sizeof...(Args) == 9999>* = nullptr>
Child(Args&&... args);
};
Aber mit der ersten Definition der Parent-Konstruktor wird nicht aufgerufen. Ich habe sogar versucht, den Elternkonstruktor als gelöscht zu markieren, aber es kompilieren und abstürzen!
Hier ist der Code mit dem gelöschten Konstruktor:
struct Parent {
Parent() = delete;
int test;
};
template<typename T>
struct Child : T {
Child() = default;
// Will obviously not call this one
template<typename... Args, std::enable_if_t<sizeof...(Args) == 9999>* = nullptr>
Child(Args&&... args);
};
int main() {
Child<Parent> test;
std::cout << "This is a test: " << test.test << std::endl;
}
Ich bin mit Visual Studio 2015 Update 3.
'std :: enable_if_t' sollte ein harter Fehler sein, kein Ersatz Versagen. –
TartanLlama
tatsächlich hast du recht. Ich werde prüfen, ob das immer noch passiert. –
Führt der Code nicht zu undefiniertem Verhalten? Vergleichen Sie mit [dies] (http://stackoverflow.com/questions/40842044/are-checked-guard-parameter-packs-cause-of-ill-formed-programs-in-case-of-specia) –