【问题标题】:Error compiling std::count() in solaris在 solaris 中编译 std::count() 时出错
【发布时间】:2013-12-26 11:42:38
【问题描述】:

我在我的代码中使用 std::count()。我的代码在 windows 中成功构建,但我无法在 Solaris 下编译,

下面给出完整的功能,

unsigned int 
BBGENTVerify::tokenizeTickerEID(const std::string p_czTickerEIDs,\
                                std::vector<int>& p_rTickerEIDsVector){

    int l_iStartPos = -1;
    int l_iEndPos   = -1;

    unsigned int l_iEIDsPresent = std::count(p_czTickerEIDs.c_str(), \
                        p_czTickerEIDs.c_str() + p_czTickerEIDs.size(), ',') + 1;
    do{
        l_iEndPos = p_czTickerEIDs.find(",", l_iStartPos + 1);
        if (l_iEndPos == -1){
            l_iEndPos = p_czTickerEIDs.size() - l_iStartPos;
        }
        p_rTickerEIDsVector.push_back(atoi\
            (p_czTickerEIDs.substr(l_iStartPos +1, l_iEndPos).c_str()));
        l_iStartPos = l_iEndPos;
    }while(p_rTickerEIDsVector.size() < l_iEIDsPresent);

    return p_rTickerEIDsVector.size();
}

我遇到了错误,

"src/fileENTForP.cpp", line 136: Error: Could not find a match for std::count<std::InputIterator, std::T, std::Size>(const char*, const char*, char) needed in BBGENTVerify::tokenizeTickerEID(const std::string, std::vector<int>&).
1 Error(s) detected.
clearmake: Error: Build script failed for "release/sun_solaris64/BBGENTVerify.o"\

此代码在windows平台编译成功。 我做了一些调查,发现 Solaris 编译器不知何故采用了其他一些模板签名,带有一个额外的参数。

Error: Could not find a match for std::count<std::InputIterator, std::T, std::Size>
(const char*, const char*, char)

而标准说的是签名,

template <class InputIterator, class T>
  typename iterator_traits<InputIterator>::difference_type
    count (InputIterator first, InputIterator last, const T& val);

代码需要这个签名

std::count<std::InputIterator, std::T, std::Size>

我在哪里使用/也是标准 C++ 支持的地方,

template <class InputIterator, class T>
std::count(InputIterator first, InputIterator last, const T& val);

请帮我处理这段代码。

【问题讨论】:

  • 大多数时候你都在谈论 std::count 但你也提到 std::copy() - 错字?
  • 感谢@John.. 更正。

标签: c++ stl stl-algorithm


【解决方案1】:

您似乎正在使用 RogueWave 标准 C++ 库的一个版本(尽管推荐使用 STLport 版本,但该库仍然是默认库)。此实现需要计数的初始值:

int c = std::count(begin, end, match, init);

背景是 std::iterator_traits 的想法在此实现首次发布时并不存在!

当我遇到这个问题时,我创建了一个辅助标头,它只是以一致的方式转发算法调用:

#ifndef INCLUDED_STLAUX
#define INCLUDED_STLAUX

#include <algorithm>
#include <iterator>

namespace aux {
template <typename It, type name Value>
typenane std::iterator_traits<It>::difference_type
count (It begin, It end, Value value) {
#ifdef _SUNC_PRO
    typename std::iterator_traits<It>::difference_type rc(0);
    std::count(begin, end, value, rc);
    return rc;
#else
    return std::count(begin, end, value);
#endif
}

#endif

(代码是在移动设备上输入的,可能包含一些错误;我尤其不确定要测试的正确宏)。

在实际代码中,我会一直使用aux::count()

【讨论】:

  • 感谢@Dietmar,这个解决方案似乎很有希望......但我只是想知道为什么 Solaris 仍然支持这个......这个想法让我想到了另一个想法,可能还有另一种方式!跨度>
  • @BhupeshPant:Sun 坚决不破坏他们的接口,因此他们保持整个 RogueWave 实现不变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多