0

我正在尝试声明以下两个函数以将标记化字符串重新组合在一起(分解为向量或其他迭代器兼容的数据结构):

std::string ComposeTokens(std::vector<std::string> Tokens);
std::string ComposeTokens(std::iterator first, std::iterator last);

在实现文件(此处未提供——这很明显)中,Visual Studio 的 IntelliSense 没有将任一实现识别为有效,并表示两者都与两个声明冲突。编译会产生一条消息,指出迭代器必须有一个模板。

有什么办法可以做我想做的事吗?声明迭代器<字符串>是否有效,我需要指针等吗?STL 或 Boost 或其他一些库是否已经这样做了?

4

5 回答 5

4

std::iterator 是一个基类模板,它至少需要定义一个类别和一个类类型。

您通常不会以这种方式定义迭代器 - 您使用模板定义它:

template <typename Iterator>
std::string ComposeTokens(Iterator first, Iterator last);

此外,您可能希望通过引用传递您的向量:

std::string ComposeTokens(std::vector<std::string>& Tokens);
于 2012-07-12T04:02:39.330 回答
2

只需将您的迭代器函数设为模板即可:

template <class Iterator>
std::string ComposeTokens(Iterator first, Iterator last);
于 2012-07-12T04:00:24.653 回答
1

重载方法是完全可以的。VS 并没有抱怨这一点。

我认为这是在抱怨,因为您没有正确使用迭代器。当您询问有关编译器错误的问题时,最好发布实际错误,您会得到更好的答案。

至于迭代器,它们是模板化的并且std::iterator不完整,因此会出现错误。如果您的迭代器应该来自向量,那么请std::vector<std::string>::iterator改用。

于 2012-07-12T04:00:19.093 回答
1

std::iterator不是你想的那样。

最简单的解决方案是:

template <typename Iter>
std::string ComposeTokens(Iter first, Iter last);
于 2012-07-12T04:00:50.063 回答
1

您可以使用std::accumulate

#include <algorithm>
#include <vector>
#include <string>
#include <iostream>

int main() {
    std::vector<std::string> v{"put", "me", "together"};

    std::cout << std::accumulate(v.begin(), v.end(), std::string()) << std::endl;
}
于 2012-07-12T04:08:40.427 回答