类成员与内部类型同名引发“Type does not name a type”编译错误
SubWidget& operator=(const SubWidget& rhs); ...
};
SubWidget SubWidget;
};
### 实现文件代码 ```cpp ... WidgetWrapper::SubWidget& WidgetWrapper::SubWidget::operator=(const SubWidget& rhs) // 错误出现行 { ... } ...
编译错误信息
error:
SubWidgetinstruct WidgetWrapperdoes not name a type
使用环境:Linux 22.04、GCC 9.5,将operator=内联实现到头文件时无编译错误。
提出两个问题:
- 为何编译器在此场景下无法识别
SubWidget是类型? - 是否可在实现文件中完成该函数实现以避免编译错误?
解答
1. 编译器无法识别的原因
你在WidgetWrapper结构体里同时定义了嵌套结构体类型SubWidget和同名的成员变量SubWidget。按照C++的名字查找规则,类/结构体的成员名字会优先遮蔽同名的类型名,在类外通过WidgetWrapper::SubWidget查找时,编译器会优先匹配成员变量而非嵌套类型,因此无法识别你要的SubWidget类型,进而报错。
2. 可以在实现文件中完成实现,有两种可行方案:
方案一:明确指定目标为类型
通过struct关键字或typename关键字,强制编译器将WidgetWrapper::SubWidget解析为类型:
// 用struct关键字限定类型 struct WidgetWrapper::SubWidget& WidgetWrapper::SubWidget::operator=(const struct WidgetWrapper::SubWidget& rhs) { ... } // 或用typename关键字(C++11及以上版本支持) typename WidgetWrapper::SubWidget& WidgetWrapper::SubWidget::operator=(const typename WidgetWrapper::SubWidget& rhs) { ... }
方案二:修改成员变量名,避免与类型同名
最彻底的解决方式是给成员变量改名,消除命名冲突:
// 头文件中修改成员变量名 struct WidgetWrapper { struct SubWidget { ... SubWidget& operator=(const SubWidget& rhs); ... }; SubWidget subWidget; // 改名后无冲突 }; // 实现文件中正常编写即可 WidgetWrapper::SubWidget& WidgetWrapper::SubWidget::operator=(const WidgetWrapper::SubWidget& rhs) { ... }
内容的提问来源于stack exchange,提问作者haxpor
相关产品推荐
相关产品推荐

