问题复现
在写编辑器的过程中写了这样一段
ChildSlot
[
SNew(STreeView<TSharedPtr<BTEditorFactor::CStateTreeState>>)
.OnSelectionChanged_Lambda([ = ](TSharedPtr<BTEditorFactor::CStateTreeState> Selection, ESelectInfo::Type SelectInfo){
if (SelectInfo == ESelectInfo::Type::OnMouseClick)
{
ContentManager::Getslef()->SetCurrentState(Selection);
}
})
.HeaderRow(HeaderRowWidget)
.TreeItemsSource(&ContentManager::Getslef()->m_nodeList)
.OnGetChildren(this,&CNodeWidget::GetChildren)
.OnGenerateRow(this,&CNodeWidget::GenerateRow)
.OnContextMenuOpening(this,&CNodeWidget::ContextMenuOpening)
];
这段是参考了UE中StateTree的用法。但是在我没有查看ChildSlot的传入参数时,我想获取Snew,于是我使用了一个SharePtr去接。但是报了错,
ChildSlot
[
TSharedPtr<STreeView<TSharedPtr<BTEditorFactor::CStateTreeState>>> m_nodeTreeView = SNew(STreeView<TSharedPtr<BTEditorFactor::CStateTreeState>>) //这里进行了shareRef->sharePtr的隐式转换
]
我在想应该是不能ChildSlot不能使用PTR,但是各个帖子中都提到,说SAssignNew返回了一个指针那为什么可以写成
ChildSlot
[
SAssignNew(STreeView<TSharedPtr<BTEditorFactor::CStateTreeState>>)
]
结论
事实上这里描述是不够准确的。
个人觉得应该描述为宏SAssignNew依旧返回了一个引用,但是通过函数参数来进行返回值,返回一个指针。
分析过程
首先查看ChildSlot的重载运算符,发现传入参数为Ref
那SAssignNew是怎么传入的呢,它的返回值到底是什么?
好嘛,SAssignNew返回的还是个引用。