gpt4 book ai didi

c++ - 具有默认值的模板参数在 Visual Studio 中编译错误

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:00 24 4
gpt4 key购买 nike

在将代码从 GCC 移植到 MSVC 时遇到了这个模糊的问题。

考虑以下片段:

template <typename T>
struct Foo;

template <template <typename...> typename Container, typename Arg>
struct Foo<Container<Arg>> {
using arg_t = Arg;
};

template <typename X>
struct A {};

template <typename X, typename Y = void>
struct B {};

template <typename X, typename Y = void, typename Z = void>
struct C {};

int main() {
typename Foo<A<int>>::arg_t a;
typename Foo<B<int>>::arg_t b;
typename Foo<C<int>>::arg_t c;
return 0;
}

我们使用 Foo 特性来提取模板类的第一个参数,其中从第二个模板参数开始有默认值(实际用例是 std::unique_ptr例如)。 Clang 和 GCC 完美地处理了这个片段,但是 MSVC(Visual Studio 17 附带的那个)抛出了非常不明显的编译错误。

最佳答案

事实证明,GCC 和 Clang 以某种方式处理默认模板参数,因此 A<X, Y=void><template <typename...> typename Bar, typename X> Bar<X> 接受界面。另一方面,MSVC 没有。不确定它是标准的还是只是 GCC/Clang 扩展。无论如何,解决方案是添加虚拟可变参数以匹配剩余参数

template <typename T>
struct Foo;

template <template <typename...> typename Container,
typename Arg, typename... MsvcWorkaround>
struct Foo<Container<Arg, MsvcWorkaround....>> {
using arg_t = Arg;
};

template <typename X>
struct A {};

template <typename X, typename Y = void>
struct B {};

template <typename X, typename Y = void, typename Z = void>
struct C {};

int main() {
typename Foo<A<int>>::arg_t a;
typename Foo<B<int>>::arg_t b;
typename Foo<C<int>>::arg_t c;
return 0;
}

从编译器错误中理解问题真的很难,我无法通过 google 找到解决方案,这就是为什么我想分享我的。

关于c++ - <variadic template> 具有默认值的模板参数在 Visual Studio 中编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48038402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com