如何解决模板化类中模板化类成员的推导
我正在利用 C++17 的新特性来推断模板化类中的类成员类型。具体来说,我正在这样做:
#include <array>
#include <iostream>
template <std::size_t N = 0>
class A
{
public:
using Array = std::array<int,N>;
A(const Array& arr) : myArr{arr} {}
A() = default;
void show() { std::cout << N << std::endl; }
private:
Array myArr;
};
当我构造 A
而不显式指示 N
时,编译器正确匹配构造函数并正确推导 N
!
std::array<int,3> data{1,2,3};
A a1{data};
A a2;
a1.show(); // prints 3
a2.show(); // prints 0
然而,一旦我在 A
中引入另一个模板参数,这种魔法就被破坏了,就像这样:
template <typename T,std::size_t N = 0>
class A
{
... // same content,no use of T
}
当我构造 A
传递这样的任何 T
时,它不再编译:
A<int> a1{data};
A<int> a2;
编译器在所有情况下都推导N=0
,不能将输入std::array<int,3>
分配给构造函数std::array<int,0>
中推导的参数:
error: no matching function for call to ‘A<int>::A(<brace-enclosed initializer list>)’
A<int> a1{data};
note: candidate: ‘A<T,N>::A(const Array&) [with T = int; long unsigned int N = 0; A<T,N>::Array = std::array<int,0>]’
A(const Array& arr) : myArr{arr} {}
note: no known conversion for argument 1 from ‘std::array<int,3>’ to ‘const Array&’ {aka ‘const std::array<int,0>&’}
A(const Array& arr) : myArr{arr} {}
谁能解释为什么会发生这种情况以及是否有任何解决方案?
先谢谢你!
解决方法
演绎指南不做部分匹配。
合成与否。
在第一种情况下,编译器综合了一个推导指南。
template<std::size_t N>
A(std::array<int,N>const&)->A<N>;
一旦您传递了任何模板参数,就不会使用推导指南。没有部分匹配。
请参阅 https://en.cppreference.com/w/cpp/language/class_template_argument_deduction 以了解您所谓的魔法。
如果需要,可以编写 make 函数,或者省略 int
。
至于原因,可能是担心反向兼容性和 KISS 原则。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。