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.
InformationsquelleAutor AraK | 2010-06-18
Schreibe einen Kommentar