在我的一個專案中,對于我的 C 20 概念之一,我收到錯誤“不滿足相關約束”。在我看來,我的代碼是正確的,所以我一定對語言有一些誤解。
我已經重寫了代碼以洗掉所有明顯無關的細節。
以下是包含陳述句:
#include <array>
#include <memory>
我定義的約束在Afunc下面的成員函式上:
template<typename BLikeType>
class A {
public:
A(std::shared_ptr<C> c_) : c_(std::move(c_)) {}
template<typename... Args>
requires requires (BLikeType t, Args... args) {
{t.Bfunc(c_->Cfunc(args...))};
}
std::array<double, sizeof...(Args)> Afunc(Args... args) {
return c_->Cfunc(args...);
}
private:
std::shared_ptr<C> c_;
};
類B和C的撰寫方式試圖滿足上述約束。我使用了一個std::array<double, 2>only 以便讀者理解可變引數模板 inA是必要的。
class C {
public:
C() {}
std::array<double, 2> Cfunc(double a, double b) {
return { a, b };
}
};
我也寫一個類B為模板引數BLikeType在A。下面給出:
class B {
public:
B(){}
double Bfunc(std::array<double, 2> my_array) {
return my_array[0] my_array[1];
}
};
然后我嘗試在我的主函式中測驗這個約束:
int main() {
C c{};
std::shared_ptr<C> c_ptr = std::make_shared<C>(c);
A<B> a(c_ptr);
std::array<double, 2> answer = a.Afunc<double, double>(.1, .2); // Error: the associated constraints are not satisfied
return 0;
}
為什么這會給出我的約束不滿足的錯誤?
uj5u.com熱心網友回復:
template<typename... Args>
requires requires (BLikeType t, Args... args) {
{t.Bfunc(c_->Cfunc(args...))};
}
std::array<double, sizeof...(Args)> Afunc(Args... args) {
return c_->Cfunc(args...);
}
該要求子句是不是一個完整的類方面,所以不能參照后宣告的類成員一樣c_。您可以c_在類中移動較早的宣告,但即使如此,如果函式是,它也不會看到任何必要的 cv 限定const(因為此時未看到函式宣告符)。使用尾隨的 requires 子句可以解決這個問題。但是,在這種情況下,不需要添加額外的 cv 限定,因此這并不重要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/312608.html
上一篇:模板函式的雙模板引數
