2009-07-10 12 views
0

Objective C++(?!)コードで何かを修正しようとしています。これらの言語や関連するAPIやコードベースについてはわかりませんので、私は左右に邪魔されています。(Obj)C++:テンプレートからクラスをインスタンス化(参照)し、メンバにアクセスしますか?

は、私が持っていると言う:

Vector<char, sizeof 'a'>& sourceData(); 
sourceData->append('f'); 

私はそれをコンパイルしようとすると、私が手:この場合

error: request for member 'append' in 'WebCore::sourceData', which is of non-class type 'WTF::Vector<char, 1ul >&()();

を、ベクターはWTFです::ベクトル(WebKitのか、KDEか何かから) STD :: Vectorではなく、 append()は、in this documentationのように、このテンプレートから生成されたクラスのメンバであるはずです。それはベクトルです。これは、テンプレートがテンプレート化されているタイプを取ります。

私はReal Manのプログラミング言語でプログラムを書いたことがないので、参照とポインタと参照のための表記法、およびそれらが必要な箇所について混乱しています。

私が署名して別の関数に渡したいので、私は最終的には、ベクトルの参照をしたい:

void foobar(const Vector<char>& in, Vector<char>& out) 

私はfoobarの中のconstを推測している()SIGは意味、私は無視することができるものです「心配しないでください。もしあなたがここを渡すなら、これは混乱しないでしょう。

私はまた、ポインタではないように扱うことができるC++参照のものではないので、 - >ではなく.appendを使ってみましたか?いずれにしても、同じエラーです。

私はsourceDataのような音を出すことはできません.WTF:Vector < char、1ul> &のようなものです。また、WTF :: Vectorのドキュメントから、Vectorを作成するときに.append()が得られることがわかります。しかし、私はテンプレートにも慣れていないので、私は本当にそれを読んでいるとは言えません。

EDIT:(これはパベルMinaevへの長いフォローがされる) WOW THANKSの問題が解決

私は実際にこの記事の編集を書いていましたが、Web上の参照を渡って最初の点を見つけたので、その行はコンパイラに伝えます。paramsを持たないsourceData() charのVectorを返します。この場合の「非クラス型」とは、クラスのインスタンスではない型を意味します。私はそのタイプが 'klass'ではないことを意味すると解釈しました。つまり、.addMethod(functionPointer)のように呼び出すことができると思われるタイプです。

ありがとうございます!あなたが提案したことをすることは、私が思うこの仕事をすることになります。どういうわけか、func sigがベクトル&だったので、私は&のように宣言する必要があったということを私の頭に入れました。スタック対ヒープパスの問題のように。

とにかく、それはあなたが提案したことを試したので、私の本当の問題でしたが、それは参照を初期化しません。あなたは明示的にコンストラクタを呼び出す必要がありますが、コンストラクタの引数に何かを入れて前方宣言であることを明確にすると、一時的なものに関する他のエラーで失敗しました。

この意味で、ここでは何が起こっているのかまだ分かりませんが、問題を解決するために心から感謝しています。誰かが私と将来のGoogleの人々の利益のためにいくつかの説明を追加したいなら、それは素晴らしいだろう。

答えて

2

この:

Vector<char, sizeof 'a'>& sourceData(); 

は引数を取りませんし、Vectorへの参照を返しグローバル関数を宣言しました。したがって、sourceDataという名前は機能タイプです。そのメンバーにアクセスしようとすると、それはクラス/構造体/共用体ではないことを正当に訴え、operator->は単に適用できません。その後

Vector<char, sizeof 'a'> sourceData; 

あなたは:、あなたは括弧を(彼らはあなたがコンストラクタに渡す引数を持っている場合にのみ必要とされており、どれも存在しない場合は省略されなければならない)を省略すべきである代わりに、オブジェクトを作成するには

あなたがオブジェクトではなく、オブジェクトへのポインタを持っているので、ドットがむしろ->よりも使用されている

sourceData.append('f'); 

注:APPEND呼び出すことができます。

sourceDataを、Vector&が必要な機能に渡すために特別な処理を行う必要はありません。ただ、変数を渡す - それは自動的に参照によって渡されます。

foobar(sourceData, targetData); 
0

はC++でつま先を浸漬楽しいことはありません。この場合、いくつかの古典的な間違いがあります。まず、スタックにVectorのインスタンスを作成します。この場合、空の()は、代わりに、楽器を持たず、Vectorへの参照を返すsourceDataという関数の宣言として解釈されます。コンパイラは、結果として得られた関数がクラスではないと不平を言っています(そうではありません)。代わりにVectorのインスタンスを作成するには、()のないインスタンスを宣言し、&を削除します。カッコは、引数をインスタンスコンストラクタに渡す場合にのみ必要であり、引数がない場合は省略しなければなりません。

あなたは欲しい

Vector<char, sizeof 'a'> sourceData; 
sourceData.append('f'); 

Vector<char, sizeof 'a'> outData; //if outData is not instantiated already 

foobar(sourceData, outData); 

This Wikipediaの記事は、C++の参照にまとも紹介します。

+0

1)しかし、私はスタック上にベクトルを作成するとき、どうすれば参照で渡すことができますか?同様に、実際にはどうしているのでしょうか?そこに私は、私のスタックでは、ああ、ここで関数呼び出しが来るスタックに新しいフレームをプッシュすることができます私たちのSPを保存し、私たちのlocs、OK、JMP、新しい関数...参照ポイントを保存します。どこに?囲みスタックフレームに戻る? C++での参照は古典的なようです "もっと複雑にすることでこれを簡単にすることができます!"姿勢。それから、私は実際に彼らが何であるかを知らない。 –

+0

参照の主な目的の1つは、ポインタを使用せずに参照渡しのセマンティクスを許可することです。ポインタとは異なり、参照はその参照先のエイリアスに似ています。作成時に割り当てる必要があります。ヌルにすることはできず、別のオブジェクトへの参照として再割り当てすることもできません。私は私の答えに良い紹介へのリンクを追加しました。 –

+0

リファレンスは確かに元のオブジェクトを指します。これは上位スタックフレームの変数です(C++のローカル変数への参照を返すのは良い考えではありません)。これはC++には新しいものではありません。C++よりずっと前にAlgolやPascalのようなものに「参照渡し」が登場して以来、このように機能しています。 –

関連する問題