我在我的代码中使用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);
请帮我这个代码。
答案 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()
。