Warum sind nicht-template-Spezialisierungen erlaubt sein, in verschiedenen namespaces?
Bitte, sehen, was ich zu tun versuche:
#include <iostream>
namespace first
{
template <class T>
class myclass
{
T t;
public:
void who_are_you() const
{ std::cout << "first::myclass"; }
};
}
namespace second
{
using first::myclass;
template <>
class myclass <int>
{
int i, j;
public:
void who_are_you() const
{ std::cout << "second::myclass"; }
};
}
Dies ist nicht erlaubt. Könnten Sie bitte klären, warum nicht Spezialisierungen in verschiedenen namespaces, und was sind die möglichen Lösungen? Auch ist es etwas fester in C++0x?
Dies würde mir erlauben, zum Beispiel, sich zu spezialisieren std::max
, std::swap
, std::numeric_limits
usw.. ohne Rückgriff auf nicht definiertes Verhalten durch hinzufügen von etwas zu ::std::
?
@AndreyT Hier ist, wie ich dachte, dass ich es verwenden würde:
//my_integer is a class
std::numeric_limits<my_integer>::max(); //specialized std::numeric_limits for my_integer
Kann das getan werden?
- Als alternative konnte man nicht machen, eine neue Vorlage erbt von der standard?
- Gemäß §17.4.3.1/1: "kann Ein Programm hinzufügen von template-Spezialisierungen für alle standard-Bibliothek Vorlage-Namensraum std. Eine solche Spezialisierung (vollständige oder teilweise) einer Standardbibliothek der Vorlage der Ergebnisse zu undefiniertem Verhalten, es sei denn, die Erklärung hängt von einer Benutzer-definierten Namen der externen Verknüpfung "und", es sei denn, die Spezialisierung entspricht der standard-Bibliothek Voraussetzungen für die original-Vorlage." So, während es gibt Einschränkungen, die Sie hinzufügen können solche Spezialisierungen zu
::std::
unter den richtigen Umständen. - Sarg, dachte ich, etwas hinzuzufügen, würde das Ergebnis ein Undefiniertes Verhalten! würde bitte eine Antwort, die erklärt, wie diese Anforderungen erfüllen?
- Spezialisiert Vorlage gar nichts hinzufügen, um den namespace und damit nie Probleme verursacht. Effektives C++ empfiehlt sogar, sich zu spezialisieren
std::swap
. - Wie bereits in der Antwort, diese Frage dem standard C++11 geändert wurde der text bezüglich template-Instanziierungen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
C++ 2003, §17.4.3.1/1: "kann Ein Programm hinzufügen von template-Spezialisierungen für alle standard-Bibliothek Vorlage-Namensraum std. Eine solche Spezialisierung (vollständige oder teilweise) einer Standardbibliothek der Vorlage der Ergebnisse zu undefiniertem Verhalten, es sei denn, die Erklärung hängt von einer Benutzer-definierten Namen der externen Verknüpfung "und", es sei denn, die Spezialisierung entspricht der standard-Bibliothek Voraussetzungen für die original-Vorlage."
Als solche, Sie sind berechtigt, sich zu spezialisieren, eine Bibliothek Vorlage und setzen Sie Ihre Spezialisierung im namespace
std
, solange es hängt davon ab, einen benutzerdefinierten Typ und erfüllt die Anforderungen der ursprünglichen Vorlage.Den code, den Sie haben in Ihrer bearbeiteten Frage scheint zu sein, eine Spezialisierung für einen Benutzer-definierten Namen, die (vermutlich), hat externe Bindung, so sollten Sie keine Probleme haben, mit, dass ein Teil der Dinge.
Bleibt also nur die Anforderung, dass Ihre Spezialisierung erfüllen die Anforderungen der ursprünglichen Vorlage. Für Ihre Art, die meisten von diesen werden wohl die Grenze auf trivial. Der einzige Teil, den ich sehen kann, die möglicherweise nicht offensichtlich ist, dass Sie scheinen zu haben, um eine Spezialisierung für die ganze Vorlage, nicht nur
numeric_limits::max()
. I. e., Sie haben zu tun, die so etwas wie (Beispiel sollten in der ballpark für eine 128-bit Ganzzahl ohne Vorzeichen):Durchaus ein paar von denen sind wirklich für die FP-Typen, und ist nicht erforderlich, der aussagekräftig ist für ein integer-Typ; ich glaube, Sie müssen noch umgesetzt werden.
Es die Dinge verkompliziert:
Ich verstehe deine frustration, ich habe oft gewünscht, für die gleiche Sache. Es scheint auf jeden Fall möglich und ich sicherlich nicht kaufen, die logische Gruppierung argument, allerdings muss ich zugeben, dass es noch mehr Aufwand vom compiler Schriftsteller und Parsen von C++ korrekt ist schon schwer genug, wie es steht.
Vorlagen sind ein bisschen chaotisch in C++ - wenn Sie möchten, meiner Meinung nach, aber dann ist es leicht zu sagen, mit dem Vorteil der Erfahrung und nachdem er gesehen 20 Jahre nutzen 🙂
Warum sollte eine solche Frage selbst entstehen? Ohne zu verstehen, dass es schwierig ist, auch nur ansatzweise zu beantworten.
Spezialisierung ändert das Haupt-template. Es ist nicht "lösbare" in irgendeiner Weise aus der Hauptvorlage. In gewisser Weise, wie ein high-level-Konzept, es ist immer noch die gleiche Vorlage (obwohl auf einer niedrigeren Ebene ist definiert als eine unabhängige ein). So, aus offensichtlichen Gründen, es ist in dem gleichen Namensraum wie die hauptmaske.
Sorry, ich kann einfach nicht eine bessere Erklärung, denn ich verstehe nicht, wie solche Fragen entstehen können.
BTW, was meinst du mit "in anderen namespace"? Sie möchten die Spezialisierung auf ein Mitglied der anderen namespace? Oder Sie möchten Ihre Spezialisierung definiert werden, die in einem anderen namespace in den source-code, aber immer noch ein Mitglied der original-namespace?