質問: remove_if(v.begin(), v.end(), choice); v.erase(rmvIter, v.end()); sort(v.begin(), v.end(), comp); system("pause"); return 0; } ### 試したこと comp、choice関数をクラスの外でのみ定義するとエラーが解決できることを確認しました。 クラスの使用方法がおかしいのでしょうか? ### 補足情報(FW/ツールのバージョンなど) visual studio を使用しています。
回答: メンバ関数は`this`になるインスタンスがないと呼び出せません。 std::mem_fnを用いて ``` #include bool vec::choice() { // right == thisと置く return (x < -10 || x>10 || y < -10 || y>10); } auto rmvIter = remove_if(v.begin(), v.end(), mem_fn(&vec::choice)); ``` なんて事もできますが まぁ普通はstaticメンバ関数を用いて ``` struct vec{ double x, y; static bool comp(const vec& rLeft, const vec& rRight); static bool choice(const vec& right); } // 定義部分は変化なし // ただし、インスタンスがないのでthisポインタやメンバ変数はない事には注意 // (クラス内の関数には違いないので、引数などでインスタンスを渡すとprivateメンバ変数にもアクセスする事はできます) bool vec::comp(const vec& rLeft, const vec& rRight) { return ((rLeft.x * rLeft.x) + (rLeft.y * rLeft.y)) < ((rRight.x * rRight.x) + (rRight.y * rRight.y)); } bool vec::choice(const vec& right) { return(right.x < -10 || right.x>10 || right.y < -10 || right.y>10); } // 呼び出し時は若干変化 auto rmvIter = remove_if(v.begin(), v.end(), vec::choice); ``` こんな事をします。 なお、`for (auto p = v.begin(); p != v.end(); p++) {`はrange-based forを用いて ``` for (auto& val : v) { val.x = rand() % 100; val.y = rand() % 100; } ``` と書けます。