2010-12-19 3 views
9

Ich habe gerade eine Containerbibliothek mit Auslassung veröffentlicht. Und der Sun-Compiler beschwert sich über diese:Vorlagenargumente zu Vorlagenfunktionen

template <class T, class R> 
bool operator==(const IndexedSkipList<T,R> &left, const IndexedSkipList<T,R> &right) 
{ 
    return ((left.size() == right.size()) && 
      (std::equal(left.begin(), left.end(), right.begin()))); 
} 

Die Fehler sind:

"include/CSIndexedSkipList.h", line 65: Error: Too few arguments for template std::reverse_iterator<CS::BidiIdxIterator<CS::IndexedSkipList<CS::T, CS::R>>>. 
"include/CSIndexedSkipList.h", line 207:  Where: While specializing "CS::IndexedSkipList<CS::T, CS::R>". 
"include/CSIndexedSkipList.h", line 207:  Where: Specialized in non-template code. 

Der obige Code ist, was bei 207 beginnt Aber es scheint, dass es über die reverse_iterator beschwert. Ich kann es nicht wirklich verstehen. Ich habe keinen direkten Zugriff auf den Sun-Compiler, also habe ich mich gefragt, ob ich etwas falsch mache.

Auch ich verwende nur ein Template-Argument in reverse_iterator, aber ich bemerkte die SGI-Dokumentation zu sagen, dass es keinen Standard für das zweite Argument T. ist Überall, wo ich zwar geschaut haben, sie diese nur verwenden:

typedef std::reverse_iterator<iterator> reverse_iterator; 

Das ist Zeile 65, über die sich der Compiler beschwert. Muss ich T als Parameter hinzufügen? Ich kann den Fehler nicht herausfinden.

BTW, das funktioniert auf gcc auf allen Plattformen die ich finden konnte. Und es funktioniert auch in Borland.

Antwort

10

Wie unter Comparing C++ Standard Libraries libCstd and libstlport erläutert, wird der Sun C++ - Compiler mit zwei Implementierungen einer "C++ - Standardbibliothek" geliefert: libCstd und libstlport. Leider ist libCstd nicht standardkonform, aber aus Gründen der Abwärtskompatibilität ist es der Standard. Neben anderen Unterschieden verwendet die libCstd-Version der Vorlage std::reverse_iterator mehr als einen Vorlagenparameter.

Sie müssen den Compiler anweisen, libstlport zu verwenden, indem Sie die Compileroption -library=stlport4 übergeben.

Siehe auch:

0

By the way, -library=stlport4 ist keine Option für leistungskritische Multithreading-Anwendungen auf Solaris laufen, da die Version von STLPort mit Sun ausgeliefert Studio 12.1/12.2 ist viel langsamer als libCstd aufgrund von Spinlock-Mutexen bei Zuweisung/Freigabe, die unter Solaris zu langsam sind. STLPort5 sollte in dieser Hinsicht besser sein, aber ich habe es versäumt, es auf Solaris zu bauen. Es scheint so, als ob STLPort nicht mehr aktiv unterstützt oder unter Solaris verwendet wird, um es gelinde auszudrücken. Also mussten wir komplett auf libCstd umstellen, sowohl für SPARC als auch für x86.

Verwandte Themen