2016-09-04 3 views
-4

次のようなコンパイルを試みると、タイトルにエラーメッセージが表示されます。クラスstd :: vector <Object>には 'x'という名前のメンバーはありません

class Object{ 
public: 
    Object(){ 
    //Something 
    } 
    void x(){ 
    //Something 
    } 
} 

void function(std::vector<Object>* things){ 
int someNumber; 
//Some algorithm to get the value of someNumber. 
things->resize(someNumber); 
for(int i=0;i<someNumber;i++){ 
    things[i].x(); 
} 
} 

int main(){ 
vector<Object> things; 
function(&things); 
return 0; 
} 

何が問題の原因になりますか?

+1

** - 1 **これは**ありません実際のコード**。再現可能な例がないと投票しました。つまり、メンバー関数 'x'を' o.x'と呼ぶことはできません。 –

+1

'things'はポインタです。 'std :: vector 'へのポインタです。したがって 'things [i]'は 'std :: vector 'です。 'std :: vector 'は 'x'という名前のフィールドを持っていません。 'Object'が' x() 'と呼ばれるメンバ関数を持っているという事実は無関係です。ファンタジーコードではなく、実際のコードを投稿すれば、誰かがこれを行う正しい方法を教えてくれるかもしれません。 –

+0

大変申し訳ございません。私は 'things [i] .x()'と書くことを意図していました。 – Letokteren

答えて

5

あなたが[]を使用するときに、それはベクトルの配列ようthingsを扱っている、あなたのベクトルにポインタを渡しています。あなたはそれはあなたがその先頭にポインタで示される配列にアクセスしていると仮定しポインタ[]を使用する場合C++

void function(std::vector<Object>& things) 
{ 
    things[0]; // element of passed in vector (Object) 
} 

void function(std::vector<Object>* things) 
{ 
    things[0]; // element of array of vectors (vector<Object>) 
} 

参照してベクトルを渡して試してみてください。

あなたの場合はの配列の配列を持ち、[]はその配列のベクターの1つを選択していると仮定しています。

vector<Object>* things; 

(*things)[0]; // dereference the pointer then access the elements 
+0

私はそれが必要でした。どうもありがとうございました! – Letokteren

1
void function(std::vector<Object>* things){ 
int someNumber; 
//Some algorithm to get the value of someNumber. 
things->resize(someNumber); 
for(int i=0;i<someNumber;i++){ 
    things[i].x(); 
} 
} 

thingsがポインタである:

はあなたが[]を使用する前に示されるように、またはポインタデリファレンスを参照してベクトルに渡す必要がありますので、ベクトルの要素にアクセスする[]を使用したいです。ポインタthings[i]のためになるようにあなたがしようとしたものではありません*(things+i)に等しく、次のいずれかが必要です。

(*things)[i].x(); 

以上の冗長:

things->operator[](i).x(); 
関連する問題