)'"?-6ren"> )'"?-在 C++20 中,我们有更好的 NTTP,它允许字面量类类型: template struct A{}; template // note: it is a placeholder for NT-6ren">
gpt4 book ai didi

c++ - 为什么会出现错误 "no matching function for call to ' A(A<...auto...> )'"?

转载 作者:行者123 更新时间:2023-12-03 06:50:14 24 4
gpt4 key购买 nike

在 C++20 中,我们有更好的 NTTP,它允许字面量类类型:

template <typename T>
struct A{};

template <A> // note: it is a placeholder for NTTP A<T>
struct B{};
但是当我尝试为 B 专门化一个模板时:
template <typename>
struct is_B{};

template <A x>
struct is_B<B<x>>{}; // error!!!
编译器(GCC 10 或 GCC 11(trunk))转储了一堆错误:
prog.cc:11:15: error: class template argument deduction failed:
11 | struct is_B<B<x>>{};
| ^
prog.cc:11:15: error: no matching function for call to 'A(A<...auto...>)'
prog.cc:2:8: note: candidate: 'template<class T> A()-> A<T>'
2 | struct A{};
| ^
prog.cc:2:8: note: template argument deduction/substitution failed:
prog.cc:11:15: note: candidate expects 0 arguments, 1 provided
11 | struct is_B<B<x>>{};
| ^
prog.cc:2:8: note: candidate: 'template<class T> A(A<T>)-> A<T>'
2 | struct A{};
| ^
prog.cc:2:8: note: template argument deduction/substitution failed:
prog.cc:11:15: note: mismatched types 'A<T>' and 'A<...auto...>'
11 | struct is_B<B<x>>{};
| ^
prog.cc:11:16: error: template argument 1 is invalid
11 | struct is_B<B<x>>{};
| ^~
我找到了一个解决方案,它为 A 提供了一个明确的参数。 :
template <typename T, A<T> x>
struct is_B<B<x>>{};
但是它是多余的,并且无法解决 A时相同的错误。用于 using :
template <A x>
using B_t = B<x>; // same error!!!
那么还有其他解决方案吗?

最佳答案

似乎 GCC 不喜欢作为 NTTP 推断类类型的占位符,应该按照 [temp.param]/6 接受。 (强调我的):

A non-type template-parameter shall have one of the following(possibly cv-qualified) types:

  • a structural type (see below),
  • a type that contains a placeholder type ([dcl.spec.auto]), or
  • a placeholder for a deduced class type ([dcl.type.class.deduct]).

已经有一个相关的错误报告( PR96331,参见@TC 提供的示例)。

关于c++ - 为什么会出现错误 "no matching function for call to ' A(A<...auto...> )'"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64567607/

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