考虑以下程序:
namespace NS2 {
class base { };
template<typename T>
int size(T& t) {
std::cout << "size NS2 called!" << std::endl;
return sizeof(t);
}
};
namespace NS1 {
class X : NS2::base { };
}
namespace NS3 {
template<typename T>
int size(T& t) {
std::cout << "size NS3 called!" << std::endl;
return sizeof(t) + 1;
}
template<typename T>
class tmpl
{
public:
void operator()() { size(*this); }
};
};
int main() +{
NS3::tmpl<NS1::X> t;
t();
return 0;
}
我的编译器(gcc 4.3.3)没有编译程序,因为对 size 的调用不明确。命名空间 NS2 似乎已添加到类 tmpl 中大小调用的关联命名空间集中。即使在阅读了 ISI 标准中关于 Koenig Lookup 的部分之后,我也不确定这种行为是否符合标准。是吗?有没有人知道在不使用 NS3 前缀限定大小调用的情况下解决此行为的方法?
提前致谢!