2010年4月30日 (金曜日)

00:20:26 # Life C++のコンパイルエラー。 undefined reference to vtable for ... というメッセージはあるいみ意味不明さで有名なエラーらしい。 親クラスの中の最初のvirtual functionの実体をどこにも定義していない場合に出るエラーだそうな。 virtual hoge();virtual hoge() {} に直したらエラーが消えた。

httpserver.cc:(.text._ZN10threadpool10UrlHandlerD2Ev[threadpool::UrlHandler::~UrlHandler()]+0xd): undefined reference to `vtable for threadpool::UrlHandler'
/tmp/ccRiUGHt.o:(.rodata._ZTI16SimpleUrlHandler[typeinfo for SimpleUrlHandler]+0x8): undefined reference to `typeinfo for threadpool::UrlHandler'
collect2: ld returned 1 exit status
	

22:50:21 # Life C++での文字列比較。 String型の文字列と、const char* の比較(string("hogehoge")と "hogehoge")ってどうなっているのだろうと おもってgccの出力を眺めてみた。 みてみると当たり前の結果に。 basic_stringというclassがあって、それがoperator== を実装していて、 operator==(const char*, string) と operator==(string, const char*) とを定義している(stringとconst char*そのものではないけど)、ということだった。 このケースでは、 コンパイラが文字列だからと何か賢くコンテキストを判断しているというよりはC++の定義どおりにコンパイラが動いているという印象。 しかしこの間数名(_ZNKSs7compareEPKc)が暗号っぽいのはなんとかならないものか。 これはまだいいとしても、basic_stringのコンストラクタっぽいタイミングで呼ばれている _ZNSsC1EPKcRKSaIcEはなにだかさっぱりわからない。 demangle すればよいんだろうか。

.LBB210:
	.file 3 "/usr/include/c++/4.3/bits/basic_string.h"
	.loc 3 2189 0
	movl	$.LC0, 4(%esp)
	movl	%ebx, (%esp)
.LEHB1:
	call	_ZNKSs7compareEPKc
.LBE210:
	.loc 1 13 0
	testl	%eax, %eax
	jne	.L6
	

23:00:00 # Life C++ で string を初期化するのに null を渡したら exception が発生する。 しかしメッセージがけっこう遠回りだ。 初めてみたときにどの行の何が原因なのかを探すのに結構時間がかかりそうな気がする。

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_S_construct NULL not valid
Aborted
	
Junichi Uekawa

$Id: dancer-diary.el,v 1.94 2009/10/21 14:02:48 dancer Exp $