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 を使用するよりも悪いオプションになります)。
では、名前空間を指定せずにテンプレート化された関数を正確に呼び出すことができないのはなぜですか (そして、名前空間ディレクティブを使用も使用もしていないと仮定します)?