Warum können Vorlagen nicht in externen "C" -Blöcken sein?

Dies ist ein follow-up-Frage zu eine Antwort zu Ist es möglich, mit typedef einen Zeiger-auf-extern-"C"-Funktion geben Sie innerhalb von einer Vorlage?

Dieser code nicht kompilieren mit g++Visual C/C++, und Comeau C/C++ im Grunde mit der gleichen Fehlermeldung:

#include <cstdlib>

extern "C" {
    static int do_stuff(int) {
        return 3;
    }

    template <typename return_t_, typename arg1_t_>
    struct test {
        static void foo(return_t_ (*)(arg1_t_)) { }
    };
}

int main()
{
    test<int, int>::foo(&do_stuff);
    return EXIT_SUCCESS;
}

g++ sagt "error: template mit C linkage", Visual C/C++ - compiler emittiert Fehler C2894und Comeau C/C++, sagt "Fehler: diese Erklärung kann nicht extern "C" Verknüpfung".

Die Sache ist, alle sind glücklich mit:

#include <cstdlib>

extern "C" {
    static int do_stuff(int) {
        return 3;
    }

    struct test {
        static void foo(int (*)(int)) { }
    };
}

int main()
{
    test::foo(&do_stuff);
    return EXIT_SUCCESS;
}

Abschnitt 7.5, Linkage-Spezifikationen, von der C++ - Standard besagt:

Einem C-Sprache-Verknüpfung ignoriert, denn die Namen von class-member und die member-Funktion
die Art der Klasse member-Funktionen.

Und es gibt sogar das Beispiel:

extern "C" {
    class X {
        void mf(); //the name of the function mf and the member
                //function's type have C++ language linkage
        void mf2(void(*)()); //the name of the function mf2 has C++ language
                //linkage; the parameter has type pointer to C function
    };
}

Wenn Vorlagen erstellt wurden, dürfen in extern "C" - Blöcke, dann die member-Funktionen der Instanzen hätte C++ - Bindung.

Aber warum hat das Kapitel 14 Vorlagen, die C++98-Standard Zustand:

Einen Namen für die Vorlage haben kann linkage (3.5). Eine Vorlage, ein template explizite Spezialisierung (14.7.3), und eine Klasse Vorlage teilweise Spezialisierung nicht haben C linkage.

Was bedeutet es, dass eine Vorlage "können" haben-Gestänge? Was ist die Vorlage, die Bindung?

Warum ist es ausdrücklich untersagt, eine Vorlage haben, mit der C-Verknüpfung, wenn eine Klasse ist okay, und alle member-Funktionen von instantiierungen des template (der Standard-Konstruktor, Destruktor und Zuweisungsoperator überladen) hätte C++ linkage?

InformationsquelleAutor der Frage Daniel Trebbien | 2011-02-02

Schreibe einen Kommentar