【问题标题】:Template arguments to template functions模板函数的模板参数
【发布时间】:2011-05-27 18:04:01
【问题描述】:

我刚刚发布了一个跳过列表容器库。 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。

【问题讨论】:

    标签: c++ templates stl


    【解决方案1】:

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

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

    另见:

    【讨论】:

      【解决方案2】:

      顺便说一下,-library=stlport4 不是在 Solaris 上运行的性能关键型多线程应用程序的选项,因为 Sun Studio 12.1/12.2 附带的 STLPort 版本比 libCstd 慢得多,因为分配时存在自旋锁互斥锁/deallocation 在 Solaris 上太慢了。 STLPort5 在这方面应该会更好,但我未能在 Solaris 上构建它。至少可以说,STLPort 似乎不再在 Solaris 上得到积极支持或使用。因此,对于我们所有的软件,无论是在 SPARC 上还是在 x86 上,我们都必须完全切换到 libCstd

      【讨论】:

        猜你喜欢
        • 2013-08-02
        • 1970-01-01
        • 2013-04-12
        • 1970-01-01
        • 2021-10-18
        • 1970-01-01
        • 2018-12-16
        • 2016-05-23
        相关资源
        最近更新 更多