C言語のライブラリのD言語バインディングを作成しています(YusukeSuzuki/ccv.d)。
コンパイラは dmd v2.066.0 です。
ライブラリ ccv.d で関数 ccv_get_dense_matrix_cell_by
を定義しています。
module ccv;
extern(C)
{
// ...
void* ccv_get_dense_matrix_cell_by(ulong type, ccv_dense_matrix_t* x, ulong row, ulong col, ulong ch)
{
return
(((type) & CCV_32S) ? cast(void*)((x).data.i32 + ((row) * (x).cols + (col)) * CCV_GET_CHANNEL(type) + (ch)) :
(((type) & CCV_32F) ? cast(void*)((x).data.f32+ ((row) * (x).cols + (col)) * CCV_GET_CHANNEL(type) + (ch)) :
(((type) & CCV_64S) ? cast(void*)((x).data.i64+ ((row) * (x).cols + (col)) * CCV_GET_CHANNEL(type) + (ch)) :
(((type) & CCV_64F) ? cast(void*)((x).data.f64 + ((row) * (x).cols + (col)) * CCV_GET_CHANNEL(type) + (ch)) :
cast(void*)((x).data.u8 + (row) * (x).step + (col) * CCV_GET_CHANNEL(type) + (ch))))));
}
// ...
}
テスト用の実行ファイルのソース app.d でオーバーロードしたテンプレート ccv_get_dense_matrix_cell_by(T)
を定義しています。
// ...
import ccv;
T* ccv_get_dense_matrix_cell_by(T)(ccv_dense_matrix_t* x, ulong row, ulong col, ulong ch)
{
static assert(false);
return cast(T*)(ccv_get_dense_matrix_cell_by(0, x, row, col, ch));
}
T* ccv_get_dense_matrix_cell_by(T : ubyte)(ccv_dense_matrix_t* x, ulong row, ulong col, ulong ch)
{
return cast(T*)(ccv_get_dense_matrix_cell_by(CCV_8U, x, row, col, ch));
}
T* ccv_get_dense_matrix_cell_by(T : int)(ccv_dense_matrix_t* x, ulong row, ulong col, ulong ch)
{
return cast(T*)(ccv_get_dense_matrix_cell_by(CCV_32S, x, row, col, ch));
}
T* ccv_get_dense_matrix_cell_by(T : float)(ccv_dense_matrix_t* x, ulong row, ulong col, ulong ch)
{
return cast(T*)(ccv_get_dense_matrix_cell_by(CCV_32F, x, row, col, ch));
}
T* ccv_get_dense_matrix_cell_by(T : long)(ccv_dense_matrix_t* x, ulong row, ulong col, ulong ch)
{
return cast(T*)(ccv_get_dense_matrix_cell_by(CCV_64S, x, row, col, ch));
}
T* ccv_get_dense_matrix_cell_by(T : double)(ccv_dense_matrix_t* x, ulong row, ulong col, ulong ch)
{
return cast(T*)(ccv_get_dense_matrix_cell_by(CCV_64F, x, row, col, ch));
}
void main(string[] args)
{
// ...
}
これをコンパイルすると引数から関数を決定できないとコンパイルエラーが発生します。
test/app.d(13): Error: template app.ccv_get_dense_matrix_cell_by cannot deduce function from argument types !()(int, ccv_dense_matrix_t*, ulong, ulong, ulong), candidates are:
テンプレート内の ccv_get_dense_matrix_cell_by
の呼び出しを ccv.ccv_get_dense_matrix_cell_by
とするとコンパイルが成功します。 直感的には引数の型が異なっているので ccv.
がなくてもオーバーロードされた関数が解決できると思うのですが、なぜ失敗するのでしょうか。