2010-12-19 18 views
9

Acabo de lanzar una biblioteca de contenedor de skiplist. Y el compilador de Sun se queja de esto:Argumentos de plantilla para las funciones de plantilla

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()))); 
} 

Los errores son:

"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. 

El código anterior es lo que se inicia en 207. Sin embargo, parece que se queja de la reverse_iterator. Realmente no puedo entenderlo. No tengo acceso directo al compilador de Sun, así que me preguntaba si estoy haciendo algo mal.

Además, sólo estoy usando un parámetro de plantilla en reverse_iterator, pero me di cuenta de la documentación de SGI diciendo que no hay ningún valor predeterminado para el segundo argumento de T. En todas partes he buscado sin embargo, sólo tiene que utilizar esto:

typedef std::reverse_iterator<iterator> reverse_iterator; 

Esa es la línea 65 de la que el compilador se queja. ¿Debo agregar T como parámetro? No puedo entender el error en cuestión.

Por cierto, esto funciona en gcc en todas las plataformas que pude encontrar. Y también funciona en Borland.

Respuesta

10

Como se explica en Comparing C++ Standard Libraries libCstd and libstlport, el compilador de Sun C++ se envía con dos implementaciones de una "biblioteca estándar de C++": libCstd y libstlport. Desafortunadamente, libCstd no se ajusta a los estándares, pero es el predeterminado por razones de compatibilidad con versiones anteriores. Entre otras diferencias, la versión de libCstd de la plantilla std::reverse_iterator utiliza más de un parámetro de plantilla.

Debe indicar al compilador que use libstlport al pasar la opción del compilador -library=stlport4.

Consulte también:

0

Por cierto, -library=stlport4 no es una opción para las aplicaciones multiproceso de rendimiento crítico que se ejecutan en Solaris porque la versión de STLPort enviado con Sun Studio 12.1/12.2 es mucho más lento que libCstd debido a muteles de bloqueo de spinlock en asignación/desasignación que son demasiado lentos en Solaris. STLPort5 debería ser mejor en este sentido, pero no pude construirlo en Solaris. Parece que STLPort ya no se admite ni usa activamente en Solaris, por decir lo menos. Entonces, tuvimos que cambiar a libCstd por completo para todo nuestro software, tanto en SPARC como en x86.

Cuestiones relacionadas