2012-08-10 12 views
9

以外は、これらの誤差のいくつかはC++:「『[クラス名]用のTypeInfo』を未定義参照」の原因は、仮想関数

virtual void draw() {}; 

virtual void draw(); 

を修正することによって解決されるものですしかし、仮想関数以外のこれらのエラーの他の原因は何ですか? 次のエラーの原因となる可能性があります。

/tmp/cciGEgp5.o:(.rodata._ZTI14CustomXmppPump[typeinfo for CustomXmppPump]+0x18): 
    undefined reference to `typeinfo for XmppPump' 
+1

おそらく、.hppファイルまたは.hppファイルがビルドにあり、対応する.cppファイルがありません。 –

+0

宣言と定義が混乱しています。 –

+3

RTTIなしでコンパイルしているようです。定義されていない参照は、実際の仮想関数ではなく** typeinfo **のものです。これはlibjingleサイトでも見つかる["既知の問題"](http://code.google.com/p/libjingle/issues/detail?id=143)です。 – Damon

答えて

5

GCCでは、最初の非インライン仮想メソッドを使用して、vtableオブジェクトとtypeinfoオブジェクトが作成される変換単位を決定します。そのメソッドを定義しないと、そのメソッドをどこかに定義し、その定義がクラスのvtableとtypeinfoの出力を出すのを待っているので、エラーが表示されます。

http://gcc.gnu.org/onlinedocs/gcc/Vague-Linkage.html

あなたがvirtual void draw() {};のインライン定義にvirtual void draw();の宣言を変更すると、それはvtableのを放射するために、異なる機能を選びます。

+0

仮想のすべての定義が表示されない限り、それを含むすべてのTUは独自のコピーを取得できます(悪い) – justin

+0

@Justin:オブジェクトコードは、リンカによって排除されなければならず、時間を節約することができます。 –

9

RTTI(-frtti)を使用してコンパイルしている場合は、依存ライブラリも-fno-rttiではなくコンパイルされていることを確認してください。それ以外の場合は、-fno-rttiでコンパイルされたクラスをサブクラス化するか、dynamic_castを使用すると、typeinfoエラーが発生します。

関連する問題