18505
C言語のライブラリのD言語バインディングを作成しています（[YusukeSuzuki/ccv.d](https://github.com/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.`
がなくてもオーバーロードされた関数が解決できると思うのですが、なぜ失敗するのでしょうか。
CC BY-SA 3.0
2015-01-13T08:54:59.630
4500
2015-11-07T06:44:12.657
2015-01-13T09:12:20.273
4978
2112
question
d templates dmd
D言語: モジュール名を省略した関数呼び出しがコンパイルできない理由
Dでの関数テンプレートは以下の様な糖衣構文です．

```

    template ccv_get_dense_matrix_cell_by(T){
        T* ccv_get_dense_matrix_cell_by(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));
        }
    }
    
```

なので，自分と同名の関数を呼び出す場合には，先頭に`.`をつけて`.ccv_get_dense_matrix_cell_by`とするか，モジュール名をつけて`ccv.ccv_get_dense_matrix_cell_by`として呼び出す必要があります．
CC BY-SA 3.0
2015-11-07T04:56:40.660
18505
2015-11-07T06:44:12.657
2015-11-07T06:44:12.657
5519
13160
4500
answer