Versucht, another question zu verstehen, habe ich das Beispiel mit dem folgenden Code vereinfacht.clang ++ automatischer Rückgabetypfehler für die Spezialisierung der Vorlagenmethode in der Vorlagenklasse?
template <bool>
struct foo
{
template <typename T>
auto bar (int i)
{ return i; }
};
template <>
template <typename T>
auto foo<true>::bar (int i)
{ return i; }
int main()
{
return 0;
}
g ++ 4.9.2 kompilieren Sie es ohne Problem; Klirren ++ 3.5 Die folgende Fehler
tmp_003-14,gcc,clang.cpp:12:20: error: out-of-line definition of 'bar' does not
match any declaration in 'foo<true>'
auto foo<true>::bar (int i)
^~~
Setzt man eine der beiden auto
Rückkehr Werte mit int
geben, gibt es keine Änderungen: g ++ Kompilieren und Klirren ++ geben den Fehler. Wenn der Fehler auto
durch int
ersetzt wird, verschwindet der Fehler.
Der template <typename T>
Teil ist von Bedeutung, da der folgende Code problemlos mit beiden Compilern
template <bool>
struct foo
{
auto bar (int i)
{ return i; }
};
template <>
auto foo<true>::bar (int i)
{ return i; }
int main()
{
return 0;
}
Meine Frage liegt auf der Hand: wer Recht hat?
g ++ oder clang ++?
Ich nehme an, dass g ++ richtig ist und dass dies ein Bug von clang ++ ist, aber ich bitte um Bestätigung.
ps.entschuldigung für mein schlechtes Englisch.
Try gcc 6.1 und klirren 3.8 .. –
Das war ein Clang Problem. Es funktioniert mit 3.8: https://godbolt.org/g/JkCJ6l – refi64