【问题标题】:Why do I get "invalid use of incomplete type", when the class is fully defined?当类被完全定义时,为什么我会得到“不完整类型的无效使用”?
【发布时间】:2021-11-08 13:26:10
【问题描述】:

我知道当一个基类只被前向声明时会发生这种类型的错误,但就我而言,据我所知它已经完全实现了:

我正在尝试使用文字和代数运算符创建一个只有在使用正确的单位时才能编译的单位系统。

我从一个基类 Units 开始,它只是 T 的一个包装器,并被所有其他单元继承。

然后我定义允许的代数运算符,它应该返回正确的单位。

我明白了

error: invalid use of incomplete type ‘class Units<T>’
[build]   107 |     return Mps{static_cast<T>(rhs) / static_cast<T>(lhs)};

对于此代码:

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) {
        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 typename Units<T>::Units;
};

template<typename T>
class Seconds : public Units<T>
{
    using typename Units<T>::Units;
};

template<typename T>
class Mps : public Units<T>
{
    using typename 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{static_cast<T>(rhs) / static_cast<T>(lhs)};
}


int main() {
    return 1_km / 2_s == 500_mps
}

【问题讨论】:

标签: c++ templates inheritance c++20


【解决方案1】:

看起来编译器很困惑,并且警告具有误导性。提供缺少的模板参数来修复它:

return Mps<T>{static_cast<T>(rhs) / static_cast<T>(lhs)};
          ^^^

如果您希望避免明确指定参数,您可以(可能)定义一个演绎指南。


其他问题:

  • 缺少分号。
  • 您的运算符用于浮点数,但您在 1_km 中使用整数;那是行不通的。要么使用浮点字面量,要么为整数添加重载。
  • using typename Units&lt;T&gt;::Units; 是错误的。丢掉typename

【讨论】:

猜你喜欢
  • 2017-10-24
  • 2010-10-13
  • 2021-05-02
  • 1970-01-01
  • 2016-12-21
  • 2013-11-11
  • 2023-04-09
  • 2013-05-19
相关资源
最近更新 更多