今日もg++に完敗
下記のようなコード
#include <iostream> class A { public: A() {}; virtual ~A() {}; virtual void hoge(); }; class B : public A { public: B() {} ~B() {} void hoge(); }; void B::hoge() {} int main(int argc, char** argv) { A* a = new B(); return 0; }
をコンパイルすると、次のようなリンクのエラーが出る。
Undefined symbols:
"typeinfo for A", referenced from:
typeinfo for Bin cc8qkzDW.o
"vtable for A", referenced from:
A::A() in cc8qkzDW.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
あぁ、コンストラクタの実装を忘れたんだね、と思ってソースを見ていると、とりあえず実装している。
あぁ、基底クラスのデストラクタにvirtual指定忘れたのかな、と思ってソースを見ると、ちゃんと付いている。
あれ、何が原因やねん? と悩むこと30分。void A::hoge()を実装していないか、もしくは、純粋仮想関数にしてなかったのね、と気づく。
今日も一日g++のツンデレっぷりにやられました。