Ich möchte eine Funktion Vorlage spezialisieren. Diese Funktion wird in einem Namespace deklariert:Funktion Vorlage Spezialisierung in einem Namespace
namespace foo
{
template <int>
void function();
}
(Der Einfachheit halber wird die Vorlage basiert auf einer int
, während in meiner Produktionscode, es ist ein enum class
, aber es ist das gleiche Problem Das gleiche gilt für a. Typ basierte Vorlage)
Jetzt mag ich es für einen bestimmten Wert spezialisieren:
template <>
void foo::function<0>()
{
}
Dies scheitert mit g++ -std=c++11
(Versionen 4.6, 4.7, 4.8 und 4.9) zu kompilieren:
Spezialisierung von ‚template void foo :: function()‘ in anderen Namespace [-fpermissive]
clang++ -std=c++11
akzeptiert diesen Code.
g ++ akzeptiert auch das folgende Stück:
namespace foo
{
template <>
void function<0>()
{
}
}
Wer ist richtig, gcc oder klappern?
Beide haben Recht. Der einzige Unterschied ist, dass der Klang eine Erweiterung hat, die diese - Nichtstandard - Deklaration ermöglicht. – Ethouris
@Ethouris Dies widerspricht Barrys Antwort. Möchten Sie darauf hinweisen, wo er falsch liegt? – stefan
Nein, tut es nicht, obwohl Sie meine Antwort vielleicht falsch verstanden haben. Ich sagte, dass beide Compiler Recht haben, da beide sagen, dass dieser Code nicht dem Standard C++ entspricht. Der einzige Unterschied ist, dass clang diesen ** noch nicht standardmäßigen ** Code erlaubt, aber behandelt, als würde er eine ** nicht standardisierte Erweiterung ** verwenden. – Ethouris