模板函数的模板参数

9

我刚刚发布了一个跳表容器库。然而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个回答

10
比较C ++标准库libCstd和libstlport所解释的那样,Sun C ++编译器提供了两个"C ++标准库"的实现:libCstd和libstlport。不幸的是,由于向后兼容性的原因,libCstd不符合标准规范,但它是默认库。除其他差异之外,libCstd版本的std::reverse_iterator模板使用多个模板参数。
您需要通过传入编译器选项-library=stlport4来指示编译器使用libstlport。
另请参见:

0
顺便提一下,在 Solaris 上运行性能关键的多线程应用程序时,-library=stlport4 不是一个选项,因为随 Sun Studio 12.1/12.2 发布的 STLPort 版本比由于分配/释放上的自旋锁互斥量在 Solaris 上太慢而导致的 libCstd 更慢。在这方面,STLPort5 应该更好,但我无法在 Solaris 上构建它。看起来 STLPort 在 Solaris 上不再得到积极支持或使用,至少可以这么说。因此,我们不得不完全切换到 libCstd 以供我们所有的软件使用,包括 SPARC 和 x86。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接