不同的参数值和数字 - 这是合法的C ++吗?

时间:2012-07-12 03:55:25

标签: c++ string stl iterator tokenize

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

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

在实现文件中(这里没有提供 - 很明显),Visual Studio的IntelliSense没有认识到任何一个实现是有效的,并且说两者都与两个声明冲突。编译会生成迭代器必须具有模板的消息。

有没有办法做我想做的事,在这里?是否可以声明迭代器&lt;字符串&gt;,我需要指针等吗? STL或Boost或其他一些图书馆已经完成了这项工作吗?

5 个答案:

答案 0 :(得分:4)

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

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

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

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

std::string ComposeTokens(std::vector<std::string>& Tokens);

答案 1 :(得分:2)

只需将迭代器函数设为模板:

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

答案 2 :(得分:1)

重载方法完全没问题。 VS并没有抱怨这一点。

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

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

答案 3 :(得分:1)

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

最简单的解决方案是:

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

答案 4 :(得分: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;
}