C++ Class 非类型模板参数中的类型:推导指南失败
C++ Class types in non-type template parameters: deduction guide fails
问题
我正在使用 c++2a 功能,它允许结构 / std::array 作为模板参数(g++-9.2.0
,clang
尚不支持)。
该功能称为 Class types in non-type template parameters
并在 P0732R2
中提出。
我尝试使用一个 class 的模板参数(下面示例中的结构 C
)来推导第二个 class 的相应 class 模板参数(以下示例中的结构 B
)。我特此使用我为此特定目的编写的自定义 class 模板参数推导指南。
在这个最小的示例中,我要提取的信息是两个 int
。
如果我使用这些原始类型作为模板参数,一切正常。但是,当我将信息合并到一个 std::pair
或自定义 std::struct
中时,推导失败。
代码
分离信息
下面的代码工作得很好。
#include <array>
/// Data structure which contains a constexpr context to be used for type deduction later
template <int aa, int ab> struct C {};
/// Class which has to find out its own type
template <std::size_t count, std::array<int, count> a, std::array<int, count> b> struct B {
template <int... aa, int... bb> explicit B(C<aa, bb> ... c) {}
};
/// Class deduction guide
template <int... aa, int... ab> B(C<aa, ab>... c)
->B<sizeof...(aa) + 1, std::array<int, sizeof...(aa) + 1>{aa...},
std::array<int, sizeof...(aa) + 1>{ab...}>;
int main() { B k{C<1, 2>{}, C<2, 3>{}}; }
综合信息
下面的代码编译失败。
#include <array>
/// Change: A contains the information from the previous example in a structs.
struct A { int a; int b; };
/// Data structure which contains a constexpr context to be used for type deduction later
template <A a> struct C {};
/// Class which has to find out its own type
template <std::size_t count, std::array<A, count> a> struct B {
template <A... af> explicit B(C<af> ... c) {}
};
/// Class deduction guide
template <A... af> B(C<af>... c)->B<sizeof...(af) + 1, std::array<A, sizeof...(af) + 1>{af...}>;
int main() { B k{C<A{1, 2}>{}, C<A{2, 3}>{}}; }
错误输出:
main.cc: In function ‘int main()’:
main.cc:24:14: error: class template argument deduction failed:
24 | B k {c1, c2};
| ^
main.cc:24:14: error: no matching function for call to ‘B(C<A{1, 2}>&, C<A{1, 2}>&)’
main.cc:17:20: note: candidate: ‘B(C<((const A)af)>...)-> B<(sizeof... (af) + 1), std::array<A, (sizeof... (af) + 1)>{(const A)af ...}> [with A ...af = {}]’
17 | template <A... af> B(C<af>... c)->B<sizeof...(af) + 1, std::array<A, sizeof...(af) + 1>{af...}>;
| ^
main.cc:17:20: note: candidate expects 0 arguments, 2 provided
main.cc:14:31: note: candidate: ‘template<long unsigned int count, std::array<A, count> a, A ...af> B(C<((const A)af)>...)-> B<count, a>’
14 | template <A... af> explicit B(C<af> ... c) {}
| ^
main.cc:14:31: note: template argument deduction/substitution failed:
main.cc:24:14: note: couldn’t deduce template parameter ‘count’
24 | B k {c1, c2};
我现在想知道是什么原因导致了这个问题。出现错误是因为
- ...我想达到的效果一般是不可能的
- ... g++
中还没有实现某些东西
- ...我的推理指南搞砸了?
我也不明白错误信息。该函数似乎需要零参数。是C<af>...
在构造函数中无法展开的问题吗?
@AndiG 和@walnut 用他们对我原来问题的评论回答了我的问题。
我的问题可能是由我的 G++-9
版本中的错误引起的。我目前没有使用最新版本的g++-9
,该错误至少在g++-10中得到解决。在我编译的 g++-10.0
版本 (3684bbb022c
) 中,我不再收到错误。
问题
我正在使用 c++2a 功能,它允许结构 / std::array 作为模板参数(g++-9.2.0
,clang
尚不支持)。
该功能称为 Class types in non-type template parameters
并在 P0732R2
中提出。
我尝试使用一个 class 的模板参数(下面示例中的结构 C
)来推导第二个 class 的相应 class 模板参数(以下示例中的结构 B
)。我特此使用我为此特定目的编写的自定义 class 模板参数推导指南。
在这个最小的示例中,我要提取的信息是两个 int
。
如果我使用这些原始类型作为模板参数,一切正常。但是,当我将信息合并到一个 std::pair
或自定义 std::struct
中时,推导失败。
代码
分离信息
下面的代码工作得很好。
#include <array>
/// Data structure which contains a constexpr context to be used for type deduction later
template <int aa, int ab> struct C {};
/// Class which has to find out its own type
template <std::size_t count, std::array<int, count> a, std::array<int, count> b> struct B {
template <int... aa, int... bb> explicit B(C<aa, bb> ... c) {}
};
/// Class deduction guide
template <int... aa, int... ab> B(C<aa, ab>... c)
->B<sizeof...(aa) + 1, std::array<int, sizeof...(aa) + 1>{aa...},
std::array<int, sizeof...(aa) + 1>{ab...}>;
int main() { B k{C<1, 2>{}, C<2, 3>{}}; }
综合信息
下面的代码编译失败。
#include <array>
/// Change: A contains the information from the previous example in a structs.
struct A { int a; int b; };
/// Data structure which contains a constexpr context to be used for type deduction later
template <A a> struct C {};
/// Class which has to find out its own type
template <std::size_t count, std::array<A, count> a> struct B {
template <A... af> explicit B(C<af> ... c) {}
};
/// Class deduction guide
template <A... af> B(C<af>... c)->B<sizeof...(af) + 1, std::array<A, sizeof...(af) + 1>{af...}>;
int main() { B k{C<A{1, 2}>{}, C<A{2, 3}>{}}; }
错误输出:
main.cc: In function ‘int main()’:
main.cc:24:14: error: class template argument deduction failed:
24 | B k {c1, c2};
| ^
main.cc:24:14: error: no matching function for call to ‘B(C<A{1, 2}>&, C<A{1, 2}>&)’
main.cc:17:20: note: candidate: ‘B(C<((const A)af)>...)-> B<(sizeof... (af) + 1), std::array<A, (sizeof... (af) + 1)>{(const A)af ...}> [with A ...af = {}]’
17 | template <A... af> B(C<af>... c)->B<sizeof...(af) + 1, std::array<A, sizeof...(af) + 1>{af...}>;
| ^
main.cc:17:20: note: candidate expects 0 arguments, 2 provided
main.cc:14:31: note: candidate: ‘template<long unsigned int count, std::array<A, count> a, A ...af> B(C<((const A)af)>...)-> B<count, a>’
14 | template <A... af> explicit B(C<af> ... c) {}
| ^
main.cc:14:31: note: template argument deduction/substitution failed:
main.cc:24:14: note: couldn’t deduce template parameter ‘count’
24 | B k {c1, c2};
我现在想知道是什么原因导致了这个问题。出现错误是因为
- ...我想达到的效果一般是不可能的
- ... g++ 中还没有实现某些东西
- ...我的推理指南搞砸了?
我也不明白错误信息。该函数似乎需要零参数。是C<af>...
在构造函数中无法展开的问题吗?
@AndiG 和@walnut 用他们对我原来问题的评论回答了我的问题。
我的问题可能是由我的 G++-9
版本中的错误引起的。我目前没有使用最新版本的g++-9
,该错误至少在g++-10中得到解决。在我编译的 g++-10.0
版本 (3684bbb022c
) 中,我不再收到错误。