MSVC 拒绝 GCC 接受的行语法 - 发出奇怪的抱怨

问题描述 投票:0回答:1

在我的代码中,我有以下函数模板:

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 经验的人提供一些意见,他们也许能够更好地破译这一系列错误。

arrays visual-c++ compiler-errors cuda arrayref
1个回答
0
投票

这看起来像是 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。谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.