nvcc和c++11的编译错误,需要最少的失败示例

nvcc和c++11的编译错误,需要最少的失败示例,c++11,boost,cuda,nvcc,C++11,Boost,Cuda,Nvcc,以下源于Boost的代码无法使用启用了C++11支持的nvcc 7.0进行编译: #include <memory> template<typename T> struct result_of_always_void { typedef void type; }; template<typename F, typename Enable = void> struct cpp0x_result_of_impl {}; template<typ

以下源于Boost的代码无法使用启用了C++11支持的nvcc 7.0进行编译:

#include <memory>

template<typename T>
struct result_of_always_void
{
    typedef void type;
};

template<typename F, typename Enable = void> struct cpp0x_result_of_impl {};

template<typename F,typename T0>
struct cpp0x_result_of_impl<F(T0), typename result_of_always_void< decltype(std::declval<F>()(std::declval<T0 >()))>::type >
{
    typedef decltype(std::declval<F>()(std::declval<T0 >())) type;
};


int main ()
{
    return 0;
}
我得到的错误如下:

test.cu:16:93: error: invalid use of qualified-name ‘std::allocator_traits<_Alloc>::propagate_on_container_swap’
   typedef decltype(std::declval<F>()(std::declval<T0 >())) type;
                                                                                             ^

我怀疑这是由于nvcc编译器中的一个bug造成的,但在我提交bug之前,我想问一下,是否有可能进一步简化代码,同时仍然让它产生错误?

cuda 7.5RC似乎解决了这个问题。请切换到更新的cuda版本

$ cat t877.cu
#include <memory>

template<typename T>
struct result_of_always_void
{
    typedef void type;
};

template<typename F, typename Enable = void> struct cpp0x_result_of_impl {};

template<typename F,typename T0>
struct cpp0x_result_of_impl<F(T0), typename result_of_always_void< decltype(std::declval<F>()(std::declval<T0 >()))>::type >
{
    typedef decltype(std::declval<F>()(std::declval<T0 >())) type;
};


int main ()
{
    return 0;
}
$ /usr/local/cuda-7.0/bin/nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2015 NVIDIA Corporation
Built on Mon_Feb_16_22:59:02_CST_2015
Cuda compilation tools, release 7.0, V7.0.27
$ /usr/local/cuda-7.0/bin/nvcc -std=c++11 t877.cu -o t877
t877.cu:14:93: error: invalid use of qualified-name âstd::allocator_traits<_Alloc>::propagate_on_container_swapâ
     typedef decltype(std::declval<F>()(std::declval<T0 >())) type;
                                                                                             ^
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2015 NVIDIA Corporation
Built on Thu_May__7_00:35:41_CDT_2015
Cuda compilation tools, release 7.5, V7.5.6
$ nvcc -std=c++11 t877.cu -o t877
$

当然,欢迎您提交一个bug。

cuda 7.5RC似乎解决了这个问题。请切换到更新的cuda版本

$ cat t877.cu
#include <memory>

template<typename T>
struct result_of_always_void
{
    typedef void type;
};

template<typename F, typename Enable = void> struct cpp0x_result_of_impl {};

template<typename F,typename T0>
struct cpp0x_result_of_impl<F(T0), typename result_of_always_void< decltype(std::declval<F>()(std::declval<T0 >()))>::type >
{
    typedef decltype(std::declval<F>()(std::declval<T0 >())) type;
};


int main ()
{
    return 0;
}
$ /usr/local/cuda-7.0/bin/nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2015 NVIDIA Corporation
Built on Mon_Feb_16_22:59:02_CST_2015
Cuda compilation tools, release 7.0, V7.0.27
$ /usr/local/cuda-7.0/bin/nvcc -std=c++11 t877.cu -o t877
t877.cu:14:93: error: invalid use of qualified-name âstd::allocator_traits<_Alloc>::propagate_on_container_swapâ
     typedef decltype(std::declval<F>()(std::declval<T0 >())) type;
                                                                                             ^
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2015 NVIDIA Corporation
Built on Thu_May__7_00:35:41_CDT_2015
Cuda compilation tools, release 7.5, V7.5.6
$ nvcc -std=c++11 t877.cu -o t877
$

当然,欢迎您提交bug。

谢谢您指出这一点。我知道你是英伟达的会员;考虑到这个问题已经解决了,提交这个问题有什么意义吗?我想如果你提交了一个bug,你可能会得到类似于我在这里发布的回复:它似乎在更新的版本中得到了修复,你能试试吗?除此之外,一些组织希望获得NVIDIA的官方沟通/确认,而我在这里的帖子不是在他们报告问题时发布的;报告一个bug应该会让你明白这一点。无论如何,感谢您识别您发现的任何问题,而不是忽略它们或只是解决它们。这有助于创建一个更好的工具供其他人在将来使用。顺便说一句,这段代码绝对足够短,足以说明这个问题。假设地说,如果您已经发现了这个问题并将其降低到这个级别,并且想要提交一个bug,那么您应该这样做。演示者足够矮了。在NVIDIA没有人会说,请提供一个更简单的代码,鉴于这个例子,你已经有。然而,在这里发帖并不是一个坏主意,因为它可以节省您发现解决方法的时间,而且如果您犯了错误,其他人可能会发现它。然而,像这样一个使用gcc而不是nvcc编译的主机代码很可能是一个nvcc错误。感谢您的澄清。我想我还是到此为止吧。这里的其他人现在可以获得这些信息,并且这个问题有一个明确的解决方案。感谢您指出这一点。我知道你是英伟达的会员;考虑到这个问题已经解决了,提交这个问题有什么意义吗?我想如果你提交了一个bug,你可能会得到类似于我在这里发布的回复:它似乎在更新的版本中得到了修复,你能试试吗?除此之外,一些组织希望获得NVIDIA的官方沟通/确认,而我在这里的帖子不是在他们报告问题时发布的;报告一个bug应该会让你明白这一点。无论如何,感谢您识别您发现的任何问题,而不是忽略它们或只是解决它们。这有助于创建一个更好的工具供其他人在将来使用。顺便说一句,这段代码绝对足够短,足以说明这个问题。假设地说,如果您已经发现了这个问题并将其降低到这个级别,并且想要提交一个bug,那么您应该这样做。演示者足够矮了。在NVIDIA没有人会说,请提供一个更简单的代码,鉴于这个例子,你已经有。然而,在这里发帖并不是一个坏主意,因为它可以节省您发现解决方法的时间,而且如果您犯了错误,其他人可能会发现它。然而,像这样一个使用gcc而不是nvcc编译的主机代码很可能是一个nvcc错误。感谢您的澄清。我想我还是到此为止吧。这里的信息现在可供其他人使用,并且有一个明确的问题解决方案。感谢MCVE。仅在boost中也存在同样的问题,因此以下内容可能会对其他人有所帮助:感谢MCVE。仅在boost中存在相同的问题,因此以下内容可能对其他人有所帮助: