在solaris中编译std :: count()时出错

时间:2013-12-26 11:42:38

标签: c++ stl stl-algorithm

我在我的代码中使用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);

请帮我这个代码。

1 个答案:

答案 0 :(得分: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()