双模板化函数实例化失败
Double-templated function instantiation fails
以下代码:
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++问题。
- 关于部分专业化有很多问题,但我无法弄清楚我的问题是否是其中任何一个的骗子。
你不能对模板函数进行部分专用化,因为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
}
您可以使用
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
}
相关文章:
- 从C++实例化QML
- 使用用户定义的类型 UDT 实例化 std::atomic<>。如果 UDT 具有虚函数,则 l 墨水将失败。为什么?
- 模板实例化失败:编译器选择不正确的重载函数
- 显式实例化失败的原因是什么
- 使编译在模板类的特定实例化时失败
- 类模板的成员函数有条件无效(隐式实例化有效;显式实例化失败)
- 如果实例化,如何使模板化变量专用化在编译时失败
- 在这个失败的C++类实例化中,我忽略了什么明显的事情
- 双模板化函数实例化失败
- 函数模板实例化失败
- 模板实例化与 constexpr 函数失败
- 模板化赋值运算符模板实例化失败
- std::conditional 的可变模板化使用,其中一种类型是实例化失败
- 为什么局部变量的实例化失败,而静态变量没有
- c++ dynamic_cast对装饰器实例化失败
- 由于抽象模板arg的实例化,Boost::lambda表达式编译失败.任何解释和/或解决方法
- 构建libsigc++失败(std::basic_ostream显式实例化)
- 当模板化函数实例化失败时,回退到备用函数
- QtSerialPort在错误的线程中实例化,导致信号/插槽失败
- 可以实例化 C++ 类模板,但具有相同模板参数的函数模板实例化失败