我尝试编写小模板函数make
,以便按照与Functor
相同的结构构建一些仿函数。对于带有一个参数的仿函数,可以正常工作:
template <class ARG1>
struct Functor{
Functor(ARG1 x){ }
};
template <template <class> class FCT, class ARG>
FCT<ARG> make(ARG arg){
return FCT<ARG>(arg);
}
void main(){
int a = 5;
make<Functor>(a);
}
现在我尝试扩展make
以将其用于具有任意数量参数的仿函数,例如现在的两个参数仿函数Functor
:
template <class ARG1, class ARG2>
struct Functor{
Functor(ARG1 x, ARG2 y){ }
};
template <template <class, class...> class FCT, class... ARG>
FCT<ARG...> make(ARG... arg){
return FCT<ARG...>(arg...);
}
void main(){
int a = 5;
double b = 6;
make<Functor>(a, b);
}
这不再适用,编译器说:
basic.cpp(199):错误:没有函数模板“make”匹配的实例 参数列表 参数类型是:(int,double)
老实说,我不知道这里有什么问题。我没有看到第一个例子的概念差异。我需要做些什么来使其发挥作用?
根据评论进行进一步调查:
使用g ++ - 4.8.3直接将代码编译为main.cpp
时,它可以正常工作:
/path/to/g++-4.8.3 -std=c++11 main.cpp
使用g ++ - 4.8.3通过nvcc将代码编译为main.cu
时发出错误:
/path/to/cuda/cuda-6.5/bin/nvcc main.cu -o experiments_cuda -O0 -g -ccbin=/path/to/g++-4.8.3 --compiler-options='-std=c++11' -std=c++11
此外,通过nvcc:
将代码编译为main.cpp
时,它可以正常工作
/path/to/cuda/cuda-6.5/bin/nvcc main.cpp -o experiments_cuda -O0 -g -ccbin=/path/to/g++-4.8.3 --compiler-options='-std=c++11' -std=c++11
C ++ 11标志似乎正确传递 - 如果我删除它们,我会遇到更多错误。
答案 0 :(得分:-1)
也许nvcc
需要--std c++11
而不是--std=c++11
?