提问人:Xiaoyong Guo 提问时间:12/22/2020 更新时间:12/22/2020 访问量:820
为什么这个 c++ 模板代码在“<”标记之前出现“预期”;“错误?
Why this c++ template code got "expected ‘;’ before ‘<’ token" error?
问:
该代码旨在解决这个问题:如果我们知道一个签名并绑定了前 n 个参数的参数,那么如果前 n 个参数是有界的,则获取新的调用签名。
但是当我尝试编译代码时,gcc 会出现错误。
a.cc:23:62: error: expected ‘;’ before ‘<’ token
using signature = typename GetSignature<R(Args...)>::Bind<BArgs...>::signature;
我不理想为什么会有这样的错误。
代码如下:
#include <type_traits>
template<typename T>
struct GetSignature {
using signature = typename T::signature;
};
template<typename R>
struct GetSignature<R(void)> {
template<typename... Args>
struct Bind {
using signature = R(void);
};
};
template<typename R, typename Arg, typename... Args>
struct GetSignature<R(Arg, Args...)> {
template<typename... BArgs> struct Bind;
template<typename BArg, typename... BArgs>
struct Bind<BArg, BArgs...> {
static_assert(std::is_same<Arg, BArg>::value);
using signature = typename GetSignature<R(Args...)>::Bind<BArgs...>::signature;
};
template<typename BArg>
struct Bind<BArg> {
using signature = R(Args...);
};
};
int func(bool, double, int, char);
int main() {
// GetSignature<func>::Bind<bool, double>::signature should be int(int, char)
return 0;
}
答:
2赞
FlyingRissole
12/22/2020
#1
我通过简单地替换这一行来编译您的代码
using signature = typename GetSignature<R(Args...)>::Bind<BArgs...>::signature;
有了这个
using signature = typename GetSignature<R(Args...)>::template Bind<BArgs...>::signature;
应在绑定之前使用 template 关键字,以将其视为依赖模板名称。
在那之后,我可以像这样使用你的模板类:
GetSignature<decltype (func)>::Bind<bool, double>::signature
我的机器上有 gcc 版本 10.2.0。
评论
0赞
Xiaoyong Guo
12/22/2020
谢谢。实际上我以前尝试过模板,但我在=符号的左侧添加了模板。
评论
gcc --version