Während ich einige C++ 11-Code mit beiden GCC 4.7.2 und Clang 3.1 kompiliert, stieß ich auf ein Problem mit Clang nicht zu einem Argument Argument wo abzuleiten GCC ist erfolgreich. In einer abstrakteren Form sieht der Code wie folgt aus:Variadic Vorlage als Vorlage Parameter: Abzug arbeitet mit GCC, aber nicht mit Clang
src/test.cc:
struct Element {
};
template <typename T>
struct FirstContainer {
};
template <typename T, typename U = Element>
struct SecondContainer {
};
template <template <typename> class Container>
void processOrdinary(Container<Element> /*elements*/) {
}
template <template <typename, typename> class Container>
void processOrdinary(Container<Element, Element> /*elements*/) {
}
template <template <typename, typename...> class Container>
void processVariadic(Container<Element> /*elements*/) {
}
int main() {
// This function instantiation works in both GCC and Clang.
processOrdinary(FirstContainer<Element>{});
// This function instantiation works in both GCC and Clang.
processOrdinary(SecondContainer<Element>{});
// This function instantiation works in both GCC and Clang.
processVariadic(FirstContainer<Element>{});
// This function instantiation works in both GCC and Clang.
processVariadic<SecondContainer>(SecondContainer<Element>{});
// This function instantiation works in GCC but not in Clang.
processVariadic(SecondContainer<Element>{});
return 0;
}
die Beispiele in §14.3.3 und die Spezifikationen in §14.8.2 der Standard Aus der Lektüre Ich denke, der Abzug sollte funktionieren, aber ich kann es nicht sicher sagen. Dies ist der Ausgang, den ich vom Gebäude bekomme:
mkdir -p build-gcc/
g++ -std=c++0x -W -Wall -Wextra -Weffc++ -pedantic -c -o build-gcc/test.o src/test.cc
g++ -o build-gcc/test build-gcc/test.o
mkdir -p build-clang/
clang++ -std=c++11 -Weverything -Wno-c++98-compat -c -o build-clang/test.o src/test.cc
src/test.cc:34:3: error: no matching function for call to 'processVariadic'
processVariadic(SecondContainer<Element>{});
^~~~~~~~~~~~~~~
src/test.cc:21:6: note: candidate template ignored: failed template argument deduction
void processVariadic(Container<Element> /*elements*/) {
^
1 error generated.
make: *** [build-clang/test.o] Fel 1
Warum unterscheiden sich die Ergebnisse? Ist GCC schlampig, Clang dumm, enthält mein Code nicht spezifiziertes Verhalten oder alle?
Ich stimme dir zu. Alles, was ich im endgültigen C++ 11-Entwurf gesehen habe, würde zeigen, dass dies funktionieren sollte. 14.3.3.3 ist besonders relevant. –
Ihr Beispiel fehlt ein 'typedef int Element;', oder? – Quuxplusone
Nein, am Anfang des Codes definiere ich eine Struktur mit dem Namen Element. – psyill