2017-05-21 1 views
2

Ich habe diesen seltsamen Bug, den ich nicht meinen Kopf wickeln kann. Ich habe es auf ein einfaches Beispiel reduziert. Ich kann es beheben, indem ich einen leeren Destruktor erstelle, aber ich würde wirklich gerne wissen, was vor sich geht.Linker-Fehler nicht Destruktor zu finden, wenn eine Funktion templated ist

#include <cstdio> 
#include <functional> 

struct test { 
    inline test() 
    {} 

    const std::function<void()> f; 
    const int universe = 42; 
}; 

template<size_t n = 1> 
inline void do_test(const test& t = {}) { 
    printf("%d\n", t.universe); 
} 

int main(int, char**) { 
// test t; 
    do_test(); 
    return 0; 
} 

Dies wird nicht kompilieren, um den Fehler ausgibt:

clang++ -O3 -std=c++1z -stdlib=libc++ -Wall main.cpp 
Undefined symbols for architecture x86_64: 
    "test::~test()", referenced from: 
     _main in main-df96d9.o 
ld: symbol(s) not found for architecture x86_64 

Wenn Sie entweder die Zeile Kommentar-, wo ich das test t; Objekt zu erstellen, oder die Template-Parameter von do_test() entfernen, wird es kompilieren.

Beachten Sie, dass das Beispiel stark vereinfacht ist, erfordert die tatsächliche Software den benutzerdefinierten Konstruktor, die Template-Parameter usw.

Jede Idee, warum es über beschwert sich die destructor zu finden?

+0

[Beweis hier] (http://coliru.stacked-crooked.com/a/bbf534d106b15cf2) –

+1

Sieht aus wie ein Clang Bug. GCC hat kein Problem mit diesem Code. –

+0

Kompiliert in VS2015, scheint hier in Ordnung. Es muss dann klangsspezifisch sein. Versuchen Sie, den "const test &" mit "test()" anstelle von "{}" zu initialisieren, um zu sehen, ob es sich um einen spezifischen Fehler in der Initialisierungsliste handelt. Was wahrscheinlich passieren wird, ist, dass der Compiler nicht merkt, dass er einen Standarddestruktor für die Klasse erstellen muss, wenn Sie nur per Referenz auf die Klasse verwiesen haben, und die Initialisierungsliste => Konstruktor-Autokonvertierung wird nur einmal eingefügt löste die Details der Klasse. –

Antwort

0

Bestätigter Fehler in clang < 4 scheint es.

Verwandte Themen