【发布时间】:2018-06-17 23:52:41
【问题描述】:
我有两个模板声明如下:
template < typename T >
class node {
public:
...
const unique_ptr < node < T >> & getParent();
...
private:
...
unique_ptr < node < T >> & P; //for parent node
...
};
template < typename T1, typename T2 >
class tree {
public:
tree(int, T2 & );
...
void travPreord();
...
private:
...
};
在公共方法的定义内
template<typename T1, typename T2> tree<T1,T2>::travPreord()
我有以下代码:
template < typename T1, typename T2 >
void tree < T1, T2 > ::travPreord() {
//lambda definition
function < void(unique_ptr < node < T1 >> & ) > prntNode = [ & ]
(unique_ptr < node < T1 >> & pN) {
...
if(auto rPN = pN - > getParent()) {
...
}
};
}
对于上面 if 语句条件中的赋值,我从编译器(g++ 4.2.1)得到以下错误:
错误:调用隐式删除的复制构造函数 'std::__1::unique_ptr >, std::__1::default_delete > > >' if(auto rPN = pN->getParent()){
错误中突出显示的模板实例化的参数由 main() 提供:
int main() {
vector < string > v;
...
tree < string, vector < string >> T(v.size(), v);
T.travPreord();
...
return 0;
}
我根据以下假设编写了有问题的 if 语句条件:
可以将 unique_ptr 分配给引用。
auto关键字应该将左值表达式
rPN的类型推导出为右值表达式pN->getParent()的类型,它返回一个类型unique_ptr<node<T>>&.
所以我不确定这个错误的来源。
有人能指点一下吗?
【问题讨论】:
-
如果我正确读取the type deduction rules for templates(
auto使用),则在确定推导类型A时,原始类型P的引用被剥离(参见项目#3在“开始扣除之前,对P和A进行以下调整:”之后,说明“如果P是引用类型,则使用P所引用的类型进行扣除。”)。基本上,auto表示值类型,除非您明确将其设为auto&&或auto&。使用const auto&(可能还有auto&&;我的C++ 生锈了)应该可以工作。 -
带有大量
...的代码 sn-ps 并不能很好地描述一个需要 StackOverflow 解决的好问题。请用完整、可验证和可重现的代码来说明您的示例。另外,在问题中,您指的是已删除的复制构造函数,这是不可能发生的事情,您可以删除一个或多个实例,但永远不要删除复制构造函数.... .
标签: c++ c++11 lambda unique-ptr auto