我知道當基類只是向前宣告時,會出現這種型別的錯誤,但在我的案例中,就我所知,它已經完全實作了:
我試圖創建一個單元系統,只有在使用正確的單位和代數運算子時才會編譯。
我試圖創建一個單元系統,該系統只有在使用了正確的單元、采用了字面和代數運算子時才會被編譯。
我從一個基類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<typenameT>
class Seconds : public Units< T>
{
using typename Units<T>:Units。
};
template<typenameT>
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
}
uj5u.com熱心網友回復:
看起來編譯器被混淆了,警告是誤導性的。提供缺失的模板引數來修復它:
return Mps<T> {static_cast<T>(rhs) / static_cast<T>(lhs)};
^^^
如果你想避免明確地指定引數,你可以(可能)定義一個推導指南。
其他問題:
- 漏掉了分號。
- 你的運算子是針對浮點的,但你在1_km中使用了整數;這將無法作業。要么使用浮點字面,要么為整數添加一個多載。
使用 typename Units<T>:Units;是錯誤的。失去了typename。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/316108.html
標籤:
上一篇:手機號碼前會自動添加國家代碼
