2016-10-13 10 views
-1

私はこれと私との間に頭を叩いています。私はまだC++を勉強しており、それを楽しんでいますが、私はまだすべてを理解していないし、実際には私のデータ構造クラスのポインタとクラスを掘り下げています。このソートを使ってツリーオブジェクトのフィットネス変数を比較できないのはなぜですか?ベクトル内でsort()を使用して2つのオブジェクト変数を比較する

エラーが発生しました: 'Environment :: compare':非標準構文。 '&'を使用してメンバーへのポインターを作成します。

void Environment::evolve(const int popsize,const int maxgen) { 
    std::cout << "> evolving function" << std::endl; 

    std::vector<Tree> popvec; 

    // Generate initial pop trees and store in array 
    for (int i = 0; i <= popsize - 1; i++) { 
     std::cout << "> generating initial population" << std::endl; 

     Tree membertree; 
     popvec.push_back(membertree); 
    } 

    // Loop for generations 
    for (int j = 1; j <= maxgen; j++) { 
     std::cout << "Generation " << j << ":" << std::endl; 

     // sort array by fitness 
     std::sort(popvec.begin(), popvec.end(), compare); 

     // cull herd 

     // reproduce 

    } 
} 

bool Environment::compare(Tree obj1, Tree obj2) { 
    return (obj1.fitness < obj2.fitness); 
} 

ありがとうございました。ヘッダと

編集:

#include "Tree.h" 

class Environment { 
public: 
    Environment(); 
    ~Environment(); 
    void evolve(const int popsize,const int maxgen); 
    bool compare(Tree obj1, Tree obj2); 

private: 
    Tree* poparray; 
}; 
+3

'Environment :: compare'は' static'でなければなりません。ヘッダーを表示してください。 –

+0

ありがとうございました。 – MushinZero

答えて

0

あなたはcompareを参照している、コンパイルエラーの直接の原因

std::sort(popvec.begin(), popvec.end(), compare); 

、クラスのメンバ関数です。 - それがあるべきとして(またはあなたが体操を行うことができます

std::sort(popvec.begin(), popvec.end(), &Environment::compare); 

しかしcompareは静的関数でない限り、これは動作しません:あなたは&Class::Member構文を使用する必要があるクラスのメンバ(データや関数)へのポインタを渡すにはステートフルなラムダ/ファンクタを渡しても、まともな人がこれを行う理由はありません)。

あなたはcompareの宣言を変更するべきではない本当の問題

- それstaticメンバ関数ます

static bool compare(Tree obj1, Tree obj2); 

あなたがこれを行う場合は、sort呼び出し構文を変更する必要はもうあり(ただし、まだ有効)

+0

'static'だけで十分です。ここで '&Class :: Member'構文を使う必要はありません。 '&'はオプションで、 'Class ::'は他のメンバのコンテキストで暗黙に指定されています。静的メンバーへのポインタは、[ポインタへのポインタ](http://en.cppreference.com/w/cpp/language/pointer#Pointers_to_member_functions)と同じではありません。 –

+0

@JasonC編集を参照 – krzaq

+0

私はそれにどのようなポインタを渡しますか? – MushinZero

0

あなたは例えば、staticとしてEnvironment::compareを宣言する必要があります:

class Environment { 
    ... 
    static bool compare (Tree obj1, Tree obj2); 
    ... 
}; 
+0

ありがとうございました! – MushinZero

関連する問題