Сбой создания экземпляра функции с двойным шаблоном

Следующий код:

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++.
  • Есть куча вопросов по частичной специализации, но я не могу понять, является ли мой обманом любого из них.

person einpoklum    schedule 13.11.2013    source источник


Ответы (2)


Вы не можете сделать частичную специализацию для функции шаблона, потому что C++ не определяет такую ​​вещь. Вы просто можете сделать частичную специализацию шаблона class [§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
} 
person masoud    schedule 13.11.2013
comment
Но, но... (Глаза слезятся) почему?! - person einpoklum; 13.11.2013
comment
Я не знаю, может быть, в будущем они это определят, пока у нас этого нет. Может быть, это делает некоторые несоответствия в стандарте! Кто знает!?. - person masoud; 13.11.2013
comment
Я только что прочитал это, где говорится, что то, что я пытаюсь сделать, на самом деле не считается частичной специализацией. Или я неправильно прочитал? - person einpoklum; 13.11.2013
comment
Нет, в этом коде OP пытался перегрузить функции, но вы пытаетесь выполнить частичную специализацию. - person masoud; 13.11.2013

Вы можете использовать enable_if для достижения цели.

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

template<typename T, MyEnum K>
typename std::enable_if<std::is_same<K, SomeValueOfMyEnum>::value, __global__ void>::type
myKernel<T,SomeValueOfMyEnum>(const T a[]) 
{
     // implementation
}

template<typename T, MyEnum K>
typename std::enable_if<!std::is_same<K, SomeValueOfMyEnum>::value, __global__ void>::type
myKernel<T,SomeValueOfMyEnum>(const T a[]) 
{
     // implementation
}
person procr    schedule 30.09.2018