成员模板模板参数的隐藏
hiding of template parameter of member template
来自temp.local:
在出现在外面的类模板的定义中 类模板定义,类的名称 模板隐藏了任何封闭类的模板参数的名称 模板(,但如果成员为 类或功能模板)。 [示例:
template<class T> struct A { struct B { /* ... */ }; typedef void C; void f(); template<class U> void g(U); }; template<class B> void A<B>::f() { B b; // A's B, not the template parameter } template<class B> template<class C> void A<B>::g(C) { B b; // A's B, not the template parameter C c; // the template parameter C, not A's C }
- 结束示例]
问题是,我尝试过的每个编译器(G ,VC,ICC,Clang),将C在A<B>::g(C)
中作为A的成员名称对待,并且不编译该示例。
这是一个常见的错误。?
虽然您给出的链接似乎是草稿,并且明确指出,它不是任何标准的一部分(http://eel.is/c draft/)草稿中的条款似乎与ISO C 14.6.1,第7段相同。
因此,它确实确实是一个常见的编译器错误,也可以是与其他条款相冲突并失去的条款。我验证了该示例未在MacOS Clang V802.0.42上编译。由于您说所有主要编译器都在此处发出错误,因此我怀疑由于与其他一些条款的冲突而实施该条款是不合理的。
编辑:我还在这里的标准社区中找到了与此主题有关的讨论。这里讨论的深度向我表明,该规则是有争议的,甚至可能会更改。
相关文章:
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 参数包构造函数在类模板中隐藏用户定义的转换
- C++ [错误] 声明'char '隐藏参数。什么意思?
- 'int a'声明隐藏参数
- 如何隐藏模板基类的参数类型
- 在c++中隐藏不同的std::map比较参数
- 这种获取模板参数包中最后一个元素的方法是否有隐藏的开销?
- 使用函数参数隐藏成员函数
- 函数的隐藏/锚定参数?
- 在 std::variant 中隐藏模板参数
- 视觉C++:即使使用关键字,参数声明也会隐藏类成员"this"
- 成员模板模板参数的隐藏
- 模板参数名称隐藏
- 前向声明从嵌套模板中隐藏祖先模板参数
- 为什么我在child中更改了父虚函数参数隐藏了父函数c++
- 如何在gcc错误消息中隐藏默认模板参数
- 隐藏c++参数的有趣案例(参数没有在if块中隐藏)
- 基类模板成员函数隐藏在派生类中,尽管参数列表不同
- 方法中的默认模板参数隐藏在类默认模板参数后面
- C++这个指针,在函数调用中隐藏参数