继承和成员函数模板重载
Inheritance and member-function templates overloading
我尝试用clang(3.0版本)编译以下代码,但它给了我这个错误
error: no matching member function for call to 'a'
在呼叫__a.a<0>()
。然后我尝试使用g++(版本4.2.1),它按预期编译和工作(打印出1 2
)。
#include <iostream>
struct A {
template <int> int a() { return 1; }
};
struct B: A {
using A::a;
template <int,int> int a() { return 2; }
};
int main(int, char **) {
B __a;
std::cout << __a.a<0>() << " " << __a.a<0,0>() << std::endl;
return 0;
}
我试着去看标准,但我没有发现任何解释编译器正确行为的东西。现在,我的问题是,哪个是正确的行为,如果clang工作正常,我如何修改我的代码工作预期?
深入研究c++ 03和c++ 11标准,您的代码有效且格式良好看起来并不好。c++ 03似乎允许这样做,而c++ 11标准的措辞变化似乎不允许这样做。
§7.3.3 [namespace.udecl] (Both standards)
using声明将基类中的名称引入派生类作用域时,派生类中的成员函数覆盖和/或隐藏基类中具有相同名称和参数类型的成员函数(而不是冲突)。
注意,这里没有提到任何成员函数模板。
p15 (c++ 11)当using-declaration将基类中的名称引入派生类作用域时,派生类中的成员函数和成员函数模板覆盖和/或隐藏基类中具有相同名称的成员函数和成员函数模板、形参类型列表(8.3.5)、csv -qualification和ref-qualifier(如果有的话)(而不是冲突)。
注意在新的措辞中提到了成员函数模板。还要注意,确定派生类成员是否覆盖/隐藏基类成员的列表没有提到成员函数模板的模板参数列表作为标识点,因此它被忽略。
我可能完全解释错了,但似乎Clang在这里是符合标准的编译器,而GCC以及MSVC10根据新的措辞是不符合标准的。
相关文章:
- 将重载的成员函数传递给函数模板
- 使用模板重载函数
- 函数模板实例化、替换和重载解析的顺序是什么?
- 基于 SFINAE 的特征实现问题与函数模板重载
- 如何通过签名作为模板参数来解决重载函数?
- 将模板(没有规范)传递给 std::thread() 会出现错误:<未解析的重载函数类型>匹配错误
- 重载模板<类型名...>类的函数模板
- 使用类指针重载C++命名空间函数模板专用化替代方法?
- 按返回类型重载函数模板
- 定义重载C++函数模板的原型时,使用其名称引用以前的定义是否合法?
- 用另一个函数模板重载函数模板合法吗
- 获取重载函数模板的地址
- 部分专用结构与重载函数模板
- 基于参数函数参数类型重载函数模板
- 重载函数模板
- 基于 C++98 中函数对象运算符 () 签名的“重载”函数模板
- 具有引用参数的重载函数模板
- 用子类调用时匹配模板而不是基类的重载函数模板
- 有时可以使用重载函数模板的地址
- 在命名空间中重载函数模板