"The associated constraints are not satisfied" 带有自定义 requires 子句
"The associated constraints are not satisfied" with custom requires clause
在我的一个项目中,我的一个 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_;
};
classes B
和 C
的编写方式试图满足上述约束。我使用 std::array<double, 2>
只是为了让读者理解 A
中的可变参数模板是必要的。
class C {
public:
C() {}
std::array<double, 2> Cfunc(double a, double b) {
return { a, b };
}
};
我也在A
中为模板参数BLikeType
写了一个classB
。如下所示:
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;
}
为什么会出现我的约束不满足的错误?
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...);
}
requires-clause 不是完整的-class 上下文,因此它看不到稍后声明的 class 成员,例如 c_
.您可以将 c_
的声明移到 class 的前面,但即便如此,如果函数是 const
(因为函数声明符是在那个时候看到)。使用尾随的 requires-clause 可以解决这个问题。不过,在这种情况下,没有额外的 cv 资格要添加,所以这并不重要。
在我的一个项目中,我的一个 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_;
};
classes B
和 C
的编写方式试图满足上述约束。我使用 std::array<double, 2>
只是为了让读者理解 A
中的可变参数模板是必要的。
class C {
public:
C() {}
std::array<double, 2> Cfunc(double a, double b) {
return { a, b };
}
};
我也在A
中为模板参数BLikeType
写了一个classB
。如下所示:
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;
}
为什么会出现我的约束不满足的错误?
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...);
}
requires-clause 不是完整的-class 上下文,因此它看不到稍后声明的 class 成员,例如 c_
.您可以将 c_
的声明移到 class 的前面,但即便如此,如果函数是 const
(因为函数声明符是在那个时候看到)。使用尾随的 requires-clause 可以解决这个问题。不过,在这种情况下,没有额外的 cv 资格要添加,所以这并不重要。