私はケーニッヒで見つかった例を拡張しようとしていると武の「加速C++。」私はベクトルを2つのパーティションに分割しようとする次のコードを持っています。C++コンパイラstable_partitionエラー
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
struct MyClass {
int* MyInt;
MyClass() : MyInt(NULL) {}
};
struct AnalyzeMemOps {
vector<MyClass> AllMyClassRecords; // Where I keep the MyClass instances
bool sameBaseReg(MyClass m);
vector<MyClass> splitBySameBase(vector<MyClass>& main);
AnalyzeMemOps() {}
};
// Predicate function for stable_partition
bool AnalyzeMemOps::sameBaseReg(MyClass m) {
return true;
}
vector<MyClass> AnalyzeMemOps::splitBySameBase(vector<MyClass>& main) {
vector<MyClass>::iterator it =
stable_partition(main.begin(), main.end(), sameBaseReg); // Error is here
vector<MyClass> sameBases(it, main.end());
main.erase(it, main.end());
// Print results
cout << "Split By Same Base: Returning SameBase Instrs\n";
for (vector<MyClass>::iterator i = sameBases.begin(); i != sameBases.end(); ++i) {
cout << " " << i->MyInt << "\n";
}
return sameBases;
}
int main() {
AnalyzeMemOps AMCR;
MyClass m;
AMCR.AllMyClassRecords.push_back(m);
AMCR.AllMyClassRecords.push_back(m);
AMCR.AllMyClassRecords.push_back(m);
vector<MyClass> t = AMCR.splitBySameBase(AMCR.AllMyClassRecords);
}
IがG ++でこのファイルをコンパイルしようとしたとき、私はエラーを取得:
Tile.cpp: In member function \u2018std::vector<MyClass, std::allocator<MyClass> > AnalyzeMemOps::splitBySameBase(std::vector<MyClass, std::allocator<MyClass> >&)\u2019:
Tile.cpp:26: error: no matching function for call to \u2018stable_partition(__gnu_cxx::__normal_iterator<MyClass*, std::vector<MyClass, std::allocator<MyClass> > >, __gnu_cxx::__normal_iterator<MyClass*, std::vector<MyClass, std::allocator<MyClass> > >, <unresolved overloaded function type>)\u2019
/usr/include/c++/4.4/bits/stl_algo.h:1864: note: candidates are: _BIter std::stable_partition(_BIter, _BIter, _Predicate) [with _BIter = __gnu_cxx::__normal_iterator<MyClass*, std::vector<MyClass, std::allocator<MyClass> > >, _Predicate = bool (AnalyzeMemOps::*)(MyClass)]
make: *** [a.out] Error 1
は明らかにこれはおもちゃの例ですが、私は関数プロトタイプをチェックしましたし、私がどこか分かりません私はここで間違っています。助言がありますか?
どのように「悪いフォーム」それはsplitBySameBaseメンバ関数は、sameBaseRegの非メンバ関数のバージョンを呼び出して作成するのでしょうか?私は、sameBaseRegが同じ名前空間にある場合、それが正常に動作することを発見しました。 – Zeke
@ Zeke:メンバー関数である必要がない場合は、間違いなくメンバ関数以外の関数にする必要があります。クラスのprivateまたはprotectedメンバ変数にアクセスする必要がない場合は、非メンバ関数である必要があります。 –
そのようにすると、splitBySameBase関数全体がAnalyzeMemOpクラスにある必要はありません。私は組織の目的のためにクラス内のすべての機能を持っていましたが、彼らはメンバー機能である必要はないと思います!説明ありがとう。 – Zeke