2013-11-13 2 views
1

следующий код:Дважды шаблонный функция конкретизации терпит неудачу

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

Триггеры следующее сообщение об ошибке:

error: an explicit template argument list is not allowed on this declaration

Почему?

Примечания:

  • Я уверен, что это не CUDA связанных, только C++ вопрос.
  • Есть куча вопросов по частичной специализации, но я не могу понять, является ли моя обманом любого из них.

ответ

4

Вы не можете сделать частную специализацию для функции шаблона, потому что 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 
} 
+1

Но, но ... (Глаза разорвав) [почему ?!] (http://www.freespirit.com/files/IMAGE/COVER/LARGE/ButWhyCantI.jpg) – einpoklum

+0

я не знайте, может быть, в будущем они его определяют, пока мы этого не сделали. Возможно, это делает некоторые несоответствия в стандарте! Кто знает!?. – deepmax

+0

Я только что прочитал [это] (http://stackoverflow.com/a/8061811/1593077), где он говорит, что я пытаюсь сделать, на самом деле не считается частичной специализацией. Или я неправильно понял? – einpoklum

Смежные вопросы