C++类已完整定义仍报invalid use of incomplete type错误原因排查
错误原因排查
一共有5处语法/语义错误导致编译失败,其中核心触发你给出的invalid use of incomplete type报错的是第一处错误:
- 派生类继承基类构造函数时错误添加了
typename关键字
你在Meters、Seconds、Mps三个派生类中写的using typename Units<T>::Units;不符合C++语法规则。typename仅用于标记模板中的依赖类型名,而构造函数不属于类型成员,添加typename后编译器会将Units<T>::Units识别为Units<T>类中一个未定义的类型成员,进而误认为Units<T>是不完整类型,直接触发你遇到的报错。正确写法是去掉typename,改为using Units<T>::Units;。 - 除法运算符重载的参数声明不合理
你定义的operator/参数为const Meters<T> &&rhs、const Seconds<T> &&lhs,属于const右值引用,虽然可以绑定自定义字面量生成的临时对象,但无法支持普通左值变量参与单位运算,更通用的写法是改为const左值引用:const Meters<T> &rhs、const Seconds<T> &lhs。 - 除法运算符返回值构造时未指定模板参数
你在operator/中写的return Mps{...}未指定模板参数,在部分未完全支持C++17类模板参数推导的编译器中会推导失败,建议补全模板参数为Mps<T>{...}。 - 基类
Units的三路比较运算符缺少const修饰operator<=>作为成员函数,需要添加const限定符才能支持const实例的比较运算,正确写法是constexpr auto operator<=>(const Units<T> rhs) const。 - main函数的返回语句末尾缺少分号
return 1_km / 2_s == 500_mps末尾需要添加分号才符合C++语法要求。
修正后可正常编译的完整代码
template<typename T> class Units { protected: T val; public: constexpr explicit Units(T val) : val(val) { } constexpr explicit operator T&() { return val; } constexpr explicit operator T() const { return val; } constexpr auto operator<=>(const Units<T> rhs) const { return val <=> rhs.val; } constexpr bool operator==(const Units<T> rhs) const { return val == rhs.val; } }; template<typename T> class Meters : public Units<T> { using Units<T>::Units; }; template<typename T> class Seconds : public Units<T> { using Units<T>::Units; }; template<typename T> class Mps : public Units<T> { using Units<T>::Units; }; constexpr Meters<long double> operator "" _km(long double km) { return Meters<long double>{1000 * km}; } constexpr Seconds<long double> operator "" _s(long double s) { return Seconds<long double>{s}; } constexpr Mps<long double> operator "" _mps(long double s) { return Mps<long double>{s}; } template<typename T> constexpr Mps<T> operator / (const Meters<T> &rhs, const Seconds<T> &lhs) { return Mps<T>{static_cast<T>(rhs) / static_cast<T>(lhs)}; } int main() { return 1_km / 2_s == 500_mps; }
内容的提问来源于stack exchange,提问作者feature_engineer
相关产品推荐
相关产品推荐

