【发布时间】:2021-06-18 08:10:58
【问题描述】:
我正在尝试将概念与可变参数模板一起使用。我的模板类在下面。这个概念应该说:“每个T 类型都应该有一个成员函数Func,它接受FuncArgType 类型的输入。”
#pragma once
#include <tuple>
#include <concepts>
#include <iostream>
template<typename FuncArgType, typename... Ts>
requires requires
(FuncArgType func_arg, std::tuple<Ts...> args) {
std::apply([&func_arg](auto&... ts) {(ts.Func(func_arg), ...); }, args);
}
class MyClass
{
public:
MyClass() {}
};
在我看来这是正确的,尽管我使用 std::apply 时可能会出错。然后我尝试使用MyClass 创建一个对象。我定义了两个类A 和B 作为我的Ts。 FuncArgType 是 int。
class A {
public:
A() {}
void Func(int i) {
std::cout << "Called Func of A";
}
};
class B {
public:
B() {}
void Func(int i) {
std::cout << "Called Func of B";
}
};
我现在尝试创建MyClass 的实例。
#include "MyClass.h"
int main() {
MyClass<int, A, B> my_class{}; // constraints not satisfied
return 0;
}
错误信息是
Source.cpp(4,19): error C7602: 'MyClass': the associated constraints are not satisfied
(还有其他几条错误消息,但基本上都说my_class 无效。)
为什么A 和B 不满足我的约束条件?我的约束是否说出了我想要它说的内容?如何让我的约束说出上面的粗体声明?
【问题讨论】:
-
您使用的是哪个编译器?我已经尝试过 clang 和 gcc,模板已经给了我一个错误,没有其他的。
-
Microsoft Visual C++20
-
查看 Godbolt 中的其他错误消息后,我认为错误在于在
requires expression中使用 lambda 捕获。 Lambdas、std::apply和requires对我来说仍然是新事物,所以我还在摸索中。 “错误:约束变量 'func_arg' 不能在评估的上下文中使用” -
你可以试试
std::apply([](auto&... ts) {FuncArgType i; (ts.Func(i), ...); }, args)?? t=requires子句中的参数实际上不是变量。如果可以的话,我会回答的 -
@nhatnq 没用。我收到以下错误,我之前也遇到过“Source.cpp(4,21): error C2146: syntax error: missing ';'在标识符 'myclass' 之前", "'MyClass
': 非法将此类型用作表达式", "'myclass': 未声明的标识符"。
标签: c++ compiler-errors apply variadic-templates c++-concepts