2010-12-19 180 views
9

我剛剛發佈了一個skiplist容器庫。和Sun編譯器抱怨這一點:模板參數模板函數

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

的錯誤是:

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

上面的代碼是什麼207開始,但它似乎在抱怨的reverse_iterator的。我無法真正理解它。我沒有直接訪問Sun編譯器,所以我想知道如果我做錯了什麼。

而且,我只用一個reverse_iterator的模板參數,不過我注意到,SGI的文件說,沒有默認的第二個參數T.無處不在,我雖然看了,他們只是用這個:

typedef std::reverse_iterator<iterator> reverse_iterator; 

這是編譯器抱怨的第65行。我需要添加T作爲參數嗎?我無法弄清楚有問題的錯誤。

順便說一下,這可以在我能找到的所有平臺上使用gcc。它也適用於Borland。

回答

10

如在Comparing C++ Standard Libraries libCstd and libstlport中所述,Sun C++編譯器附帶兩個「C++標準庫」實現:libCstd和libstlport。不幸的是,libCstd不符合標準,但它是出於向後兼容性原因的默認值。除其他差異外,libCstd的std::reverse_iterator模板版本使用多個模板參數。

您需要通過傳入編譯器選項-library=stlport4來指示編譯器使用libstlport。

參見:

0

順便說一句,-library=stlport4是不是在Solaris上運行,因爲STLPort版本隨太陽性能關鍵的多線程應用程序的選項由於spinlock互斥鎖在分配/釋放時太慢,所以Studio 12.1/12.2比libCstd慢得多。 STLPort5應該在這方面做得更好,但是我沒能在Solaris上構建它。至少可以這麼說,似乎STLPort不再被Solaris支持或使用。因此,我們必須完全切換到libCstd,才能在SPARC和x86上全部使用我們的軟件。