在 C++ 中,如果使用函数的第一个参数是在与我们的函数相同的命名空间中声明的类型的对象,我们可以省略命名空间限定。但是,我注意到这不适用于模板函数(如std::get)。我写了一个简单的例子来确认这确实与模板有关:
namespace ns {
struct S {};
void sFoo(const S&) {}
template<typename T> void sBar(const S&) {}
}
void foo()
{
ns::S s;
sFoo(s); // ok
sBar<int>(s); // error: ‘sBar’ was not declared in this scope
ns::sBar<int>(s); // ok
}
我尝试了显式实例化,但它没有改变任何东西(即使它会改变,它也比仅仅使用using更糟糕)。
那么,为什么我不能在不指定其命名空间的情况下调用模板化函数(并且假设既不使用也不使用命名空间指令)?