我正在尝试声明以下两个函数将标记化字符串(分解为向量或其他与迭代器兼容的数据结构)放在一起:
std::string ComposeTokens(std::vector<std::string> Tokens);
std::string ComposeTokens(std::iterator first, std::iterator last);
在实现文件中(这里没有提供 - 很明显),Visual Studio的IntelliSense没有认识到任何一个实现是有效的,并且说两者都与两个声明冲突。编译会生成迭代器必须具有模板的消息。
有没有办法做我想做的事,在这里?是否可以声明迭代器&lt;字符串&gt;,我需要指针等吗? STL或Boost或其他一些图书馆已经完成了这项工作吗?
答案 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;
}