【发布时间】:2011-12-18 02:09:21
【问题描述】:
我尝试用 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 工作正常,我如何修改我的代码以按预期工作?
【问题讨论】:
-
耐人寻味。没有工作的 clang 设置 a.t.m.但看起来它可能是一个错误。尽量避免
__a命名:以下划线开头的名称被标准保留。 -
FWIW、MSVC10 和 GCC 4.4.5 编译也很好,而 Clang 3.1 也拒绝该代码。还有,肯定和
using A::a;有关,把函数模板直接放到B里面就可以清除错误了。 -
@sehe 只是好奇,你有没有尝试编译我的代码?你用的是哪个编译器?
-
@mattia.penati:只有 g++ 4.4 到 g++-4.6.1 快速(有和没有 -std=c++0x)
-
g++ 似乎在做正确的事。我很好奇您是否尝试将函数
a()从A直接移动到B,而不是using呢?或者说是继承+使用的问题,还是简单的名字解析问题?
标签: c++ templates inheritance overloading