1

我试图让一些最初用 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(),但我必须认为我可以避免这种开销。

4

4 回答 4

1

正确的解决方案是模板FindNumMsgs,使其可以与迭代器或指针一起使用(因为指针可以用作迭代器就好了)。像这样的东西:

template <class T>
int FindNumMsgs(T it, int count) {
    while(count--) {
        // do whatever
        it++;
    }
    return n;
}
于 2009-10-19T17:16:01.290 回答
0

如果FindNumMsgs接受char*作为第一个参数,也许你可以只使用一个简单的char*指针:

int ProcessBufferForMsgs( char buf[], const size_t maxlen )
{
    char* simpleIterator = buf;
    int numMsgs = FindNumMsgs( simpleIterator, maxlen );
    ...
}
于 2009-10-19T16:16:50.737 回答
0

是时候重构了。您需要更改 FindNumMsgs 以将 (const?) char * 作为输入,或者可能提供第二个重载版本。更好的是,让它成为一个模板化函数,它接受带有迭代器或指针语义的任何东西的开始/结束对。

于 2009-10-19T16:47:53.067 回答
0

FindNumMsgs 的签名是什么?如果它需要一个 char* 你可以InputIt(buf)buf. 如果没有,那么在不更改 FindNumMsgs 的情况下您几乎无能为力。

于 2009-10-19T16:35:54.930 回答