我正在尝试获取一些最初用Microsoft Visual Studio(VS)2003编写的C ++代码,以便在VS 2008下编译,我无法找到将vector :: iterator分配到char数组开头的有效解决方案。我知道迭代器从定义为简单的指针类型(T *)变为VS 2003和VS 2005之间的类类型。这是我所谈论的一个简单示例:
typedef std::vector<char> CharContainer;
typedef CharContainer::iterator InputIt;
int FindNumMsgs( InputIt _inputIter, int _len );
int ProcessBufferForMsgs( char buf[], const size_t maxlen )
{
int numMsgs = FindNumMsgs( InputIt(buf), maxlen );
...
}
因此,在VS 2003中,这个编译并且没有问题(因为迭代器被定义为T *)。在VS 2008中,这个错误与C2440(函数样式转换)一样,因为我不能再用buf指针分配迭代器。现在迭代器是一个类类型,我怎么做才能让它在VS 2008中运行?我可以将缓冲区复制到一个向量中,然后传入myVec.begin(),但我必须认为我可以避免这种开销。
答案 0 :(得分:1)
正确的解决方案是模板FindNumMsgs
,以便它可以使用迭代器或指针(因为指针可以用作迭代器就好了)。像这样:
template <class T>
int FindNumMsgs(T it, int count) {
while(count--) {
// do whatever
it++;
}
return n;
}
答案 1 :(得分:0)
如果FindNumMsgs
接受char*
作为第一个参数,也许您只能使用一个简单的char*
指针:
int ProcessBufferForMsgs( char buf[], const size_t maxlen )
{
char* simpleIterator = buf;
int numMsgs = FindNumMsgs( simpleIterator, maxlen );
...
}
答案 2 :(得分:0)
FindNumMsgs的签名是什么?如果需要char *,您只需将InputIt(buf)
替换为buf
即可。如果没有,那么在不改变FindNumMsgs的情况下你几乎无能为力。
答案 3 :(得分:0)
重构的时间。您需要更改FindNumMsgs以将(const?)char *作为输入,或者可能提供第二个重载版本。更好的是使它成为一个模板化的函数,它使用迭代器或指针语义来获取任何东西的开始/结束对。