私は初心者です。文字列と数値データ(例えば、douubles)をテキストファイルから取得し、それをベクトルに格納するテンプレート関数を作成しようとしました。ベクトルの各要素は異なる名前または番号です。C++ newbie:テンプレート関数の問題 - 文字列と数値データをテキストファイルから取り出してベクトルに入れよう
先週、私は過負荷またはテンプレートがこれに最も適しているかどうか尋ねました。私は、結果のベクトル(私が望むもの)がテンプレートパラメータTを提供する関数に渡されるテンプレートメソッドを使いたいと思います。しかし、私は問題があります。誰かが助けることができれば、私は感謝します!コードは以下の通りですが、それに続いてエラーが表示されます。
//私のコード:メインで
template<typename T>
void readFile(const std::string& name, const std::string& find, std::vector<T>& results){
std::ifstream file(name.c_str());
std::string line;
while(std::getline(file, line))
{
if(line == find)
{
std::getline(file, line);
line.erase(remove(line.begin(), line.end(), '\''), line.end());
std::istringstream streamLine(line);
results = std::vector<T>(std::istream_iterator<T>(streamLine), std::istream_iterator<T>());
}
}
}
コール():
readFile(name, "label", results);
私は取得していますエラーは以下の通りです。関数呼び出しがどのように定義に一致しないのか分かりません。愚かな間違いのための事前の謝罪!
error: no matching function for call to
'std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >
::resize(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
私が関数にvoidの代わりに "result"を返すようにすると、物事はうまくいくようです。関数定義でreturn文で
std::vector<T> readFile(const std::string& name, const std::string& find, std::vector<T>& results)
:ここで私が何を意味するかだ
return std::vector<T>(std::istream_iterator<T>(streamLine), std::istream_iterator<T>());
しかし、このようにそれを行うには不格好/悪いスタイルらしいです。私は参照を使う方が良いと思っていたでしょう。それがうまくいかない場合でも、最初の方法(voidを含む)がうまくいかない理由を知りたいのです。
ヒントをいただければ幸いです!
「結果」と呼び出し前のコードは 'readFile'のように見えますか? – Nim
こんにちはNim ... main():const std :: string name = "test.dat";その後、std :: vector結果。ベクトルを返す –
Ant
は悪くないかもしれません。ローカル変数に直接代入すると、コンパイラはそのコピーを削除することができます。 http://en.wikipedia.org/wiki/Return_value_optimizationを参照してください。 – tenpn