C++ 为模板化方法声明元类类型是错误吗?
我想我在gcc中发现了一个bug,但我想确认一下: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(){
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不需要关键字。也许正在进行的支持两阶段查找的解析改进将使修复更容易。