2016-10-13 4 views
3

ラムダの主なパラメータである文字列にアクセスしようとすると、コンパイラはこれを認識しません。その文字列を使用して関数を呼び出します。ここでC++ Lambda - 以下の関数呼び出しで文字列パラメータが機能しない

私のコードは次のとおりです。

void removePunctuation(std::vector<std::string> &inTokens, 
        std::vector<std::string> &outTokens) { 
std::for_each(inTokens.begin(), inTokens.end(), [outTokens](std::string s) { 
    std::string newS = s; 
    // newS.erase(std::remove_if(newS.begin(), newS.end(), ispunct)); 
    outTokens.push_back(newS);}); 
} 

、次のエラーが生成されます。私はその関数を呼び出すようにしようとすると

a2.cpp:114:19: error: no matching member function for call to 'push_back' 
    outTokens.push_back(newS);}); 

私はまた、他の関数でのエラーのこの種を取得していますその呼び出しでラムダの文字列paramを使います。

ご協力いただきありがとうございます。

+2

std :: for_each(inTokens.begin()、inTokens.end()、[&outTokens](const std :: string&s){std :: string newS = s; outTokens.push_back(newS) ;}); ' –

答えて

5

デフォルトでは、ラムダ引数はpassed as read-onlyあり、

[&outTokens](std::string s) 

を試みるが(outTokensパラメータが変更されることが予想される場合、それは、あなたがとにかく欲しいものかもしれないです。)

+0

気にしないでください。コピーにのみ適用されます。 – NathanOliver

1

あなたは、参照によってoutTokensをキャプチャする必要があります:あなたは、ラムダしない限りコピーで撮影し

void removePunctuation(std::vector<std::string> &inTokens, 
        std::vector<std::string> &outTokens) { 
    std::for_each(inTokens.begin(), inTokens.end(), [&outTokens](std::string s) 
     { 
      std::string newS = s; 
      outTokens.push_back(newS); 
     }); 
} 
1

変数は、変更することはできませんmutable 。可変

は - 本体はコピーによって捕捉パラメータを変更し、変更可能なキーワードは、ラムダ式で使用していない限り、それらの非constメンバ関数

を呼び出すことができ、関数呼び出し演算子はCONSTであります - 修飾され、コピーによって取り込まれたオブジェクトは、operator()の内部からは変更不可能です。

[outTokens](std::string s) mutable { ... } 

しかし、これはあなたの意図ではないかもしれない、outTokensのコピーに変更します意味します。 (コピーに変更し、その後、リターンはあまり意味がありません。)あなたが参照してキャプチャするためにそれを変更したい場合があります:あなたはstd::transformスーツこの良く、参照することによりoutTokensをキャプチャする必要があることを

別に
[&outTokens](std::string s) { ... } 
2

outTokens.resize(inTokens.size()); 
std::transform(inTokens.begin(), inTokens.end(), outTokens.begin(), 
    [](std::string s) { 
     s.erase(std::remove_if(s.begin(), s.end(), ispunct)); 
     return s; 
    }); 

std::stringを値渡しする場合は、それを変更するために別のコピーを作成する必要はなく、removePunctuationの最初のパラメータはconst参照にする必要があります。

+0

驚くべきことに、コードがコンパイルされました! – RW23

+0

しかし、今は、すべての単一のトークンを消去しているように見えます。私の呼び出しは次のとおりです:while(getline(inFile、line)){ replaceHyphensWithSpaces(line); std :: vector initialWords、words; splitLine(行、単語); removePunctuation(initialWords、words); – RW23

+0

私はあなたのコードに示したように正確なロジックを置いて、別の方法で別の質問を作成する必要がある場合 – Slava

関連する問題