C++ 为模板化方法声明元类类型是错误吗?

C++ 为模板化方法声明元类类型是错误吗?,c++,templates,gcc,metaprogramming,compiler-bug,C++,Templates,Gcc,Metaprogramming,Compiler Bug,我想我在gcc中发现了一个bug,但我想确认一下: struct Foo { void good(int); template <typename T> void bad(T); }; structfoo{ 无效货物(int); 模板 无效差(T); }; 以下所有工作都很好: 启用test1(){} template enable\u if\u t test2(){} 启用test3(){} template enable_if_t test4(){

我想我在gcc中发现了一个bug,但我想确认一下:

struct Foo {
    void good(int);

    template <typename T>
    void bad(T);
};
structfoo{
无效货物(int);
模板
无效差(T);
};
以下所有工作都很好:

  • 启用test1(){}
  • template enable\u if\u t test2(){}
  • 启用test3(){}
  • template enable_if_t test4(){}
但这甚至无法定义:

template <typename T>
enable_if_t<is_same_v<decltype(&T::bad<int>), void (T::*)(int)>, void> test5() {}
模板
如果测试5(){},则启用测试
如果是,则会出现以下几个错误:

错误:模板参数的数目错误(1,应该是2)


有人能确认这是一个gcc错误吗?它似乎适用于其他编译器,如Visual Studio:,但使用我可以通过gcc 7.0确认这种情况是否持续。

Clang给了我一个很好的错误:错误:使用'template'关键字将'bad'视为依赖模板名称-@chris Yup,这就是问题所在。想知道为什么VisualStudio不需要这个。我想知道为什么gcc没有更大的帮助。你想把它作为一个答案吗?@chris,这是必须的吗?没有它,我调用的内容似乎非常清楚。
T::bad
对我来说似乎是一个依赖上下文。在不知道
T
是什么的情况下,我们就无法知道
bad
是什么,类似于
T::f
链接的答案中的示例。这个问题作为复本可能比用复本回答要好。但是,我不知道为什么VS不需要关键字。也许正在进行的支持两阶段查找的解析改进会使修复更容易。Clang给了我一个很好的错误:错误:使用'template'关键字将'bad'视为依赖模板名称-@chris Yup,这就是问题所在。想知道为什么VisualStudio不需要这个。我想知道为什么gcc没有更大的帮助。你想把它作为一个答案吗?@chris,这是必须的吗?没有它,我调用的内容似乎非常清楚。
T::bad
对我来说似乎是一个依赖上下文。在不知道
T
是什么的情况下,我们就无法知道
bad
是什么,类似于
T::f
链接的答案中的示例。这个问题作为复本可能比用复本回答要好。但是,我不知道为什么VS不需要关键字。也许正在进行的支持两阶段查找的解析改进将使修复更容易。