可变参数模板和模板模板(可能是与CUDA相关的编译器问题)

时间:2016-04-27 15:54:53

标签: c++ templates c++11 variadic-templates

我尝试编写小模板函数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标志似乎正确传递 - 如果我删除它们,我会遇到更多错误。

1 个答案:

答案 0 :(得分:-1)

也许nvcc需要--std c++11而不是--std=c++11