2012-04-25 12 views
0

Open Babelライブラリには、OBMolAtomiterのようなOBMolクラスのイテレータオブジェクトが多数定義されています。リンクされたページに、使用法を示す次のコードサンプルがあります。Open Babel C++ API関数の引数として直接使用するカスタムイテレータを使用できないのはなぜですか?

#include <openbabel/obiter.h> 
    #include <openbabel/mol.h> 

    OpenBabel::OBMol mol; 
    double exactMass = 0.0; 
    FOR_ATOMS_OF_MOL(a, mol) 
    { 
    // The variable a behaves like OBAtom* when used with -> and * but 
    // but needs to be explicitly converted when appearing as a parameter 
    // in a function call - use &*a 

    exactMass += a->GetExactMass(); 
    } 

FOR_ATOMS_OF_MOL(a, mol)はサイクルのために、aがイテレータ型であると宣言されている。molを反復処理するために、既存の分子であるに展開)

&*p事はで説明し、なぜ私は、お願いしたいと思いますコメントが必要です。ポインタを期待する関数にイテレータを渡したときの動作は、コードがコンパイルされていても、プログラムが奇妙に動作することです。

Googleで試したところ、iterator_traitsについてのページが見つかりました。

答えて

1

FOR_ATOMS_OF_MOL(a, mol)aのマクロコンストラクト。 OBAtomを返すには、*->演算子がオーバーロードされています。そのため、aを直接関数に送信することはできませんが、*aa->は、aOBAtom *のように動作します。

http://openbabel.org/api/2.2.0/classOpenBabel_1_1OBMolAtomIter.shtml

+0

この問題は申し訳ありません。私は何とかSTLイテレータを「互換性のある」ポインタ型にキャストでき、Babelのものができないのか疑問に思っていました。さて、イテレータをキャストすることはできません。 – user7610

+1

私のプログラムは、boolへの変換を定義しているので、OBMolAtomiterオブジェクトをintにキャストすることが可能であるため、奇妙な動作をします。私が呼び出す関数は、OBAtom *とintの両方を受け入れるためにオーバーロードされているため、起こっていたことが起こっています。 – user7610