5

次のコード:

template<typename T, MyEnum K> __global__ void myKernel(const T a[]);
template<typename T> __global__ void myKernel<T,SomeValueOfMyEnum>(const T a[]) {
    // implementation
}

次のエラー メッセージが表示されます。

エラー: この宣言では、明示的なテンプレート引数リストは許可されていません

なんで?

ノート:

  • これは CUDA 関連ではなく、C++ の問題であると確信しています。
  • 部分的な専門化に関する質問がたくさんありますが、私の質問がそれらのいずれかのだまされているかどうかはわかりません。
4

2 に答える 2

7

C++ はそのようなものを定義していないため、テンプレート関数の部分的な特殊化を行うことはできません。クラステンプレートの部分的な特殊化を行うことができます[§14.5.5 / temp.class.spec]

クラスの部分的な特殊化 -- 少し見にくいですが、役に立つかもしれません。

enum MyEnum
{
    E1, E2
};

template<typename T, MyEnum K>
struct MyKernel
{
    void operator()(const T a[])
    {
        // ...
    }
};

template<typename T>
struct MyKernel<T, E1>
{
    void operator()(const T a[])
    {
        // ...
    }
};

int main()
{
    MyKernel<int, E1>()( ... ); // <--- To call
} 
于 2013-11-13T16:57:21.600 に答える