VS19上的嵌套模板(C ++ 17)编译失败

科科良

代码:

(请注意,模板未实例化-这不是一个错误,即使没有模板,编译也会失败)main.cpp:

namespace mylib {
    template<typename ...Params>
    class SomeClass {
        public:
            template<typename ...NestedParams>
            class NestedClass {
            };

            template<typename ...NestedParams>
            NestedClass<NestedParams...> createNestedInstance();
    };
}

template<typename... Params>
template<typename... NestedParams>
typename mylib::SomeClass<Params...>::template NestedClass<NestedParams...>
mylib::SomeClass<Params...>::createNestedInstance() {
    return SomeClass::NestedClass<NestedParams...>();
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.17)
project(msvc_exploit001)

set(CMAKE_CXX_STANDARD 17)

add_library(msvc_exploit001 main.cpp)

GCC(Msys64 MinGW64):编译时无警告

Visual Studio Comminity 2019:

msvc_exploit001.cpp(25): error C2244: 'mylib::SomeClass<Params...>::createNestedInstance': unable to match function definition to an existing declaration
msvc_exploit001.cpp(25): note: see declaration of 'mylib::SomeClass<Params...>::createNestedInstance'
msvc_exploit001.cpp(25): note: definition
msvc_exploit001.cpp(25): note: 'mylib::SomeClass<Params...>::NestedClass<NestedParams...> mylib::SomeClass<Params...>::createNestedInstance(void)'
msvc_exploit001.cpp(25): note: existing declarations
msvc_exploit001.cpp(25): note: 'mylib::SomeClass<Params...>::NestedClass<NestedParams...> mylib::SomeClass<Params...>::createNestedInstance(void)'
NMAKE : fatal error U1077: 'C:\PROGRA~2\MICROS~4\2019\COMMUN~1\VC\Tools\MSVC\1427~1.291\bin\Hostx64\x64\cl.exe' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.

MSVC打印的错误包含用于声明和定义的相同签名,但它坚持认为它们不匹配。

我正在Windows 10上编译,使用CMake(CLion)和默认编译器选项(仅指定C ++ 17标准级别)

吉纳里

看来msvc与template这样编译

namespace mylib {
    template<typename ...Params>
    class SomeClass {
        public:
            template<typename ...NestedParams>
            class NestedClass {
            };

            template<typename ...NestedParams>
            NestedClass<NestedParams...> createNestedInstance();
    };
}

template<typename... Params>
template<typename... NestedParams>
typename mylib::SomeClass<Params...>::NestedClass<NestedParams...>
mylib::SomeClass<Params...>::createNestedInstance() {
    return SomeClass::NestedClass<NestedParams...>();
}

int main() {
    auto sc = mylib::SomeClass<int, bool>();
    auto c = sc.createNestedInstance<float, double>();
}

如评论中所述,标准可能需要模板。在这种情况下,也许您应该向Microsoft提交错误报告。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++ 17模板参数推导失败

来自分类Dev

在Ubuntu上编译QScintilla失败

来自分类Dev

clang编译在mariadb上失败

来自分类Dev

在 ubuntu 上编译 boch 失败

来自分类Dev

无法编译简单的C ++ 17程序

来自分类Dev

如果无法在MSVC上编译,为什么使用C ++ 17`constexpr这个模板化结构?

来自分类Dev

gcc和c ++ 17的重载解析失败

来自分类Dev

嵌套通配符的编译失败调用方法

来自分类Dev

libstdc ++ QNX交叉编译在互斥量类编译上失败

来自分类Dev

使用 CLion、CMake 和 VS2017 编译器编译 C++17

来自分类Dev

在Centos 6.6上编译Mono 3.10.0失败

来自分类Dev

Capistrano 3在资产上失败:预编译

来自分类Dev

Mac上的TypeScript编译器失败

来自分类Dev

尝试在Windows上编译Nginx时失败

来自分类Dev

Mac上的TypeScript编译器失败

来自分类Dev

Swift 1.2上的RACCommand编译失败

来自分类Dev

如何阻止cmd窗口在VS19上消失

来自分类Dev

为什么此C ++程序编译失败?

来自分类Dev

具有Qt的C ++编译失败

来自分类Dev

具有Qt的C ++编译失败

来自分类Dev

编译从 C++ 调用 Cocoa 函数失败

来自分类Dev

调试时Visual Studio Code g ++无法与c ++ 17编译

来自分类Dev

c ++ 17的charconv是否具有cmake编译功能?

来自分类Dev

DownloadManager在API 17上失败并显示ERROR_UNKNOWN

来自分类Dev

C ++嵌套模板参数查找失败

来自分类Dev

在C ++-17中,如何在编译时检测模板化静态成员函数的存在

来自分类Dev

VS17上的LINK1181链接库失败

来自分类Dev

在嵌套lambda中应用function_traits时编译失败

来自分类Dev

lambda在C ++ 14/17上失败,并且可以在更高版本上使用