0

トークン化された文字列(ベクトルまたは他のイテレータ互換のデータ構造に分割されたもの)を元に戻すために、次の2つの関数を宣言しようとしています。

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

実装ファイル(ここでは提供されていません-かなり明白です)では、Visual StudioのIntelliSenseはどちらの実装も有効であると認識しておらず、両方が両方の宣言と競合していると言っています。コンパイルすると、イテレータにテンプレートが必要であるというメッセージが生成されます。

ここで、私がやろうとしていることを行う方法はありますか?iterator <string>を宣言することはできますか、ポインタなどが必要ですか?そして、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 に答える