在我的代码中,我有以下函数模板:
template <typename T, size_t N>
// The next line is line 645 in the file
void copy(T(&destination)[N], span<T const> source, optional_ref<const stream_t> stream = {})
{
#ifndef NDEBUG
if (source.size() > N) {
throw ::std::invalid_argument(
"Attempt to copy a span of " + ::std::to_string(source.size()) +
" elements into an array of " + ::std::to_string(N) + " elements");
}
#endif
return copy(destination, source.start(), sizeof(T) * N, stream);
}
其中
optional<T>
和 optional_ref<T>
是在同一项目中定义的类,其目标是 C++11,因此没有 std::optional<T>
可用(加上带有引用的选项有 issues)。
此代码在 Linux 上使用 GCC 编译fine。但是在 Windows 上使用 MSVC - 使用 GitHub 运行程序 - 我get:
"D:\a\cuda-api-wrappers\cuda-api-wrappers\build\ALL_BUILD.vcxproj" (default target) (1) ->
"D:\a\cuda-api-wrappers\cuda-api-wrappers\build\examples\vectorAdd_nvrtc.vcxproj" (default target) (33) ->
(ClCompile target) ->
D:\a\cuda-api-wrappers\cuda-api-wrappers\src\cuda\api\memory.hpp(645,21): error C2065: 'destination': undeclared identifier [D:\a\cuda-api-wrappers\cuda-api-wrappers\build\examples\vectorAdd_nvrtc.vcxproj]
D:\a\cuda-api-wrappers\cuda-api-wrappers\src\cuda\api\memory.hpp(645,38): error C2275: 'cuda::span<const T>': illegal use of this type as an expression [D:\a\cuda-api-wrappers\cuda-api-wrappers\build\examples\vectorAdd_nvrtc.vcxproj]
D:\a\cuda-api-wrappers\cuda-api-wrappers\src\cuda\api\memory.hpp(645,52): error C2146: syntax error: missing ')' before identifier 'source' [D:\a\cuda-api-wrappers\cuda-api-wrappers\build\examples\vectorAdd_nvrtc.vcxproj]
D:\a\cuda-api-wrappers\cuda-api-wrappers\src\cuda\api\memory.hpp(645,1): error C2143: syntax error: missing ';' before '{' [D:\a\cuda-api-wrappers\cuda-api-wrappers\build\examples\vectorAdd_nvrtc.vcxproj]
D:\a\cuda-api-wrappers\cuda-api-wrappers\src\cuda\api\memory.hpp(645,1): error C2143: syntax error: missing ')' before ';' [D:\a\cuda-api-wrappers\cuda-api-wrappers\build\examples\vectorAdd_nvrtc.vcxproj]
D:\a\cuda-api-wrappers\cuda-api-wrappers\src\cuda\api\memory.hpp(645,1): error C2447: '{': missing function header (old-style formal list?) [D:\a\cuda-api-wrappers\cuda-api-wrappers\build\examples\vectorAdd_nvrtc.vcxproj]
D:\a\cuda-api-wrappers\cuda-api-wrappers\src\cuda\api\memory.hpp(645,1): error C2059: syntax error: ')' [D:\a\cuda-api-wrappers\cuda-api-wrappers\build\examples\vectorAdd_nvrtc.vcxproj]
MSVC 似乎在数组引用参数方面遇到了一些问题。但是 - 它实际上在抱怨什么?
我希望有更多 MSVC 经验的人提供一些意见,他们也许能够更好地破译这一系列错误。
这看起来像是 MSVC 错误,您可以在此处向 Microsoft 报告。与此同时,将数组别名为另一种类型对我有用:
template <typename T, size_t N>
using dest_array = T[N];
// Function template
template <typename T, size_t N>
void copy(dest_array<T, N>& destination, span<T const> source, optional_ref<const stream_t> stream = {})
{
...
}
链接到 Godbolt 示例以验证它是否适用于最新的 MSVC:https://godbolt.org/z/nb76MdP4c。谢谢!