2010-12-19 41 views
9

Właśnie wydałem bibliotekę kontenerów z pominięciami. I kompilator Sun narzeka na ten temat:Argumenty szablonów do funkcji szablonu

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

Błędy są:

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

Powyższy kod jest to, co zaczyna się na 207. Ale wydaje się, że to narzekają na reverse_iterator. Naprawdę nie mogę tego zrozumieć. Nie mam bezpośredniego dostępu do kompilatora Sun, więc zastanawiałem się, czy robię coś nie tak.

Również jestem tylko przy użyciu jednego szablonu argumentu w reverse_iterator, ale zauważyłem dokumentacji SGI mówiąc, że nie ma domyślnego dla drugiego argumentu T. Wszędzie szukałem choć, po prostu użyć tego:

typedef std::reverse_iterator<iterator> reverse_iterator; 

To jest linia 65, na którą kompiluje się kompilator. Czy muszę dodać T jako parametr? Nie mogę wykryć tego błędu.

BTW działa to na gcc na wszystkich platformach, jakie mogłem znaleźć. I działa również w Borland.

Odpowiedz

10

Jak wyjaśniono na Comparing C++ Standard Libraries libCstd and libstlport, kompilator Sun C++ jest dostarczany z dwiema implementacjami "standardowej biblioteki C++": libCstd i libstlport. Niestety, libCstd nie jest zgodny ze standardami, ale jest domyślny ze względu na kompatybilność wstecz. Wśród innych różnic, wersja szablonulibCstd używa więcej niż jednego parametru szablonu.

Należy polecić kompilatorowi użycie libstlport, przekazując opcję kompilatora -library=stlport4.

Zobacz także:

0

Nawiasem mówiąc, -library=stlport4 nie jest rozwiązaniem dla aplikacji wielowątkowych wydajności krytycznych z systemem Solaris, ponieważ wersja STLPort dostarczany z Sun Studio 12.1/12.2 jest znacznie wolniejsze niż libCstd z powodu mutexów spinlock w alokacji/dealokacji, które są zbyt wolne w systemie Solaris. STLPort5 powinien być lepszy pod tym względem, ale nie udało mi się go zbudować na Solarisie. Wygląda na to, że STLPort nie jest już aktywnie wspierany ani używany w systemie Solaris. Musieliśmy więc całkowicie przejść na libCstd dla całego naszego oprogramowania, zarówno na SPARC, jak i na x86.

Powiązane problemy