模板函数的模板参数

时间:2010-12-19 02:54:08

标签: c++ templates stl

我刚刚发布了一个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。

2 个答案:

答案 0 :(得分:10)

Comparing C++ Standard Libraries libCstd and libstlport所述,Sun C ++编译器附带了两个“C ++标准库”实现:libCstd和libstlport。遗憾的是,libCstd不符合标准,但出于向后兼容的原因,它是默认设置。除了其他差异之外,libCstd的std::reverse_iterator模板版本使用多个模板参数。

您需要通过传入编译器选项-library=stlport4来指示编译器使用libstlport。

另见:

答案 1 :(得分:0)

顺便说一句,-library=stlport4不是在Solaris上运行的性能关键型多线程应用程序的选项,因为Sun Studio 12.1 / 12.2附带的STLPort版本比libCstd慢得多由于分配/解除分配的自旋锁互斥锁在Solaris上太慢。 STLPort5在这方面应该更好,但我没能在Solaris上构建它。至少可以说,似乎不再在Solaris上主动支持或使用STLPort。因此,我们必须完全切换到libCstd我们所有的软件,包括SPARC和x86。