【发布时间】:2011-05-07 07:48:19
【问题描述】:
我遇到了一个奇怪的问题,我想知道为什么 g++ 4.1.2 的行为如此。
精简到本质:
#include <iostream>
template<typename T>
inline void f(T x) { std::cout << x*x; }
namespace foo {
class A {
public:
void f() const { f(2); }
};
}
对f(2) 的调用失败,因为编译器无法匹配模板函数f。
我可以使它与::f(2) 一起工作,但我想知道为什么这是必要的,因为它是完全明确的,而且就我(诚然过时的)匹配规则知识而言,这应该有效。
【问题讨论】:
-
你用的是什么版本的g++?
-
@j_random_hacker:这有关系吗?这种行为不是严格按照标准吗?
-
@Konrad:我不知道,但我不会假设!当然,两个 f() 都在调用范围内;由于
foo::A::f()的参数数量错误,应该将其从“可行”函数集中删除...? -
@j_random_hacker:不,他们不是,不仅有命名空间,还有类范围本身。
-
无需限定每次使用的简单解决方法是在函数体中添加
using ::f。这将把全局命名空间f带入函数的范围,在那里它将与foo::A::f一起成为候选对象
标签: c++ templates g++ matching