如何解决UE4开发中“SWidget::Construct不接受1个参数”的C2660编译错误
错误原因
你出现C2660编译错误的核心原因是Slate控件构造函数的名称大小写不匹配:
Unreal Slate框架要求自定义SWidget子类的构造方法必须命名为大写C开头的Construct,你在头文件声明、cpp实现中写的都是小写c开头的construct,属于拼写错误,没有正确重载父类的构造方法,导致Slate的声明式语法宏找不到匹配的1参数构造函数,触发报错。
修复步骤
- 修改
SPanelWidget.h中的构造函数声明,将小写开头的construct改为大写开头的Construct:
#pragma once #include "SlateBasics.h" #include "SlateExtras.h" class SPanelWidget : public SCompoundWidget { public: SLATE_BEGIN_ARGS(SPanelWidget) {} SLATE_ARGUMENT(TWeakObjectPtr<class AControlPanel>, OwningPanel) SLATE_END_ARGS() // 修正为大写C开头的Construct void Construct(const FArguments& InArgs); TWeakObjectPtr<class AControlPanel> OwningPanel; virtual bool SupportsKeyboardFocus() const override {return true;}; };
- 修改
SPanelWidget.cpp中的构造函数实现,同步修改函数名,同时补充对SLATE_ARGUMENT传入参数的赋值逻辑,避免后续使用OwningPanel时为空:
#include "SPanelWidget.h" #define LOCTEXT_NAMESPACE "Panel" // 修正为大写C开头的Construct void SPanelWidget::Construct(const FArguments& InArgs) { // 补充参数赋值逻辑 OwningPanel = InArgs._OwningPanel; const FText TitleText = LOCTEXT("ProjectTitle","Chair Table Practice Problem"); const FMargin ContentPadding = FMargin(500.f,300.f); ChildSlot [ SNew(SOverlay) + SOverlay::Slot() .HAlign(HAlign_Fill) .VAlign(VAlign_Fill) [ SNew(SImage) .ColorAndOpacity(FColor::Black) ] + SOverlay::Slot() .HAlign(HAlign_Fill) .VAlign(VAlign_Fill) .Padding(ContentPadding) [ SNew(SVerticalBox) +SVerticalBox::Slot() [ SNew(STextBlock) .Text(TitleText) ] ] ]; } #undef LOCTEXT_NAMESPACE
- 修改完成后,右键项目.uproject文件选择「Generate Visual Studio project files」重新生成项目文件,再重新编译项目即可解决报错。
内容的提问来源于stack exchange,提问作者Supreeto
相关产品推荐
相关产品推荐

