2017-05-29 9 views
-1

10個のオブジェクトを作成するためにベクトル上に 'generate'関数を使用する必要があります。C++ベクトル生成関数クラスオブジェクト

Type 'Point' does not provide a call operator 

I:

vector<Point> v (10); 
generate (v.begin(), v.end(), Point()); 

私はそれをコンパイルするとき、私はこのエラーが表示されます。

Point(){ 
     this->x=rand()%100; 
     this->y=rand()%100; 
}; 

は、その後、私はベクトルを作成し、機能 'を生成' を使用します:私は、コンストラクタを持つクラスのポイントを持っていますなぜか分からない。

+0

STDを生成する関数を必要とする::関数オブジェクトを期待生成します。それを見てください。 – DeiDei

答えて

3

Pointという既定の構成インスタンスでベクターを塗りたいと思われます。

vにはすでにデフォルトの構成インスタンスPointが存在するため、実際に問題が発生する前にstd::generateを呼び出す必要はありません。 は、Generatorとして、関数オブジェクト、つまりoperator()のオブジェクトを想定しています。std::generateは、Generatorとしています。 Pointには1つもありません。彼らはこのような関数オブジェクトであるとしてラムダを渡すと、良いアイデアです:

std::generate(v.begin(), v.end(), []() { 
    return Point{}; 
}); 
+0

今は正しいです。どうも :) –

2

ジェネレータ関数のプロトタイプがhere記載されています。生成する次の値を返す関数でなければなりません。単一の既定の構成済みのインスタンスPointを渡しています。おそらく、あなたはPointのジェネレータ関数としてコンストラクタを提供しようとしていましたが、コンストラクタが条件を満たさず(何も返されません)、決して直接呼び出されるべきではなく、そのアドレスは決して取得できません1つへの参照)。

ポイントを返すだけの別の機能を提供する必要があります。最も簡単な方法は、ラムダ関数std::generateを渡すことです。しかし、

std::vector<Point> v(10); 
std::generate(v.begin(), v.end(), []() { return Point{}; }); 

ラインstd::vector<Point> v(10);はすでに10デフォルトはPointオブジェクトを構築し作成することに注意してください:あなたはこのような何かをするだろう。あなたのランダム化ロジックはデフォルトコンストラクタにあるので、この場合はstd::generateを使うのは冗長です。

0

あなたはポイント

Point RandomPoint() { return Point(); } 

int main(int argA, char** argV) 
{ 
    vector<Point> v(10); 

    generate(v.begin(), v.end(), RandomPoint); 

    return 0; 
} 
関連する問題