@dascandy正确地指出了与你的法典有什么错误。 我试图提出一些理由:
页: 1 因为这一论点是int*
和unique_ptr<int>
。 有一个建筑商接受<代码>int*。 请允许我忽视以下事实:我们重新使用<代码>:unique_ptr,只是谈论我们所写的一个模板类别(并且可以专门化)。
编辑员为什么要引用<代码>unique_ptr<int>? 论点为t int
, 它为int*
。 为什么应该 t问:unique_ptr<int*>
? 当然,这将产生汇编错误,因为unique_ptr<int*>
s 构造者获得int*
。 除非我增加一个专业:
template<>
class unique_ptr<int*>
{
public:
unique_ptr(int*) {}
};
现在,unique_ptr<int*>
将汇编成册。 汇编者应如何知道选择哪些,unique_ptr<int>
或unique_ptr<int*>
? 如果我增加另一个专业?
template<>
class unique_ptr<double>
{
public:
unique_ptr(int*) {}
};
The compiler now has three options to choose from, and it has to instantiate the template with every possible argument in order to find them. Clearly this is not feasible, especially with multiple template arguments and template recursion.
您可以做些什么是将所推断的类型与一个模版连接起来的工厂功能:
template<typename T>
std::unique_ptr<T> make_unique(T* arg) { return arg; }
(of course, this won t work because unique_ptr
cannot be copied. But the idea is valid, and used in e.g.make_shared
and make_pair
.)
一些极端ug节的例子:
人们可以辩称,unique_ptr<jointd_ptr<int>>
。 该法典有效。
或如何:
template<typename T>
class unique_ptr
{
public:
explicit unique_ptr(T* arg);
unique_ptr(int*, enable_if<(sizeof(T) > 16)>::type* = 0);
};