少し受け入れられた答えを洗練させたいと思います。OPの質問では明確ではありませんが、標準(Kornelが引用)の重要な部分は次のとおりです(私の強調):
ただし、明示的なテンプレート引数を持つ関数テンプレートが使用されている場合、呼び出しには正しい構文形式がありません
したがって、禁止されているのは、ADLに依存し、明示的なテンプレート引数を使用することです。残念ながら、型以外のテンプレート引数を使用するには、明示的な引数を使用する必要があります(デフォルト値がない場合)。
以下はこれを示すサンプルコードです。
[住む]
#include <string>
#include <utility>
namespace C {
struct B { };
template<class T> void f(T t){}
}
void g(C::B b) {
f(b); // OK
//f<C::B>(b); // ill-formed: not a function call, but only
// because explicit template argument were used
std::string s;
move(s); // OK
//move<std::string&>(s); // Error, again because
// explicit template argument were used
std::move<std::string&>(s); // Ok
}
int main()
{
C::B b;
g(b);
}