2016-11-29 2 views
3

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.

+3

'std :: enable_if_t ' sollte ein harter Fehler sein, kein Ersatz Versagen. – TartanLlama

+0

tatsächlich hast du recht. Ich werde prüfen, ob das immer noch passiert. –

+0

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) –

Antwort

Verwandte Themen