为什么这个 c++ 模板代码在“<”标记之前出现“预期”;“错误?

Why this c++ template code got "expected ‘;’ before ‘<’ token" error?

提问人:Xiaoyong Guo 提问时间:12/22/2020 更新时间:12/22/2020 访问量:820

问:

该代码旨在解决这个问题:如果我们知道一个签名并绑定了前 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;
}
C++ 模板-元编程

评论

0赞 Sprite 12/22/2020
无法在 GCC 上重现,可能是 MSVC 错误?戈德博尔特
0赞 Kuba hasn't forgotten Monica 12/22/2020
请提供 gcc 版本(输出 ),以及传递给 gcc 的参数(文件名除外)。gcc --version

答:

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
谢谢。实际上我以前尝试过模板,但我在=符号的左侧添加了模板。