>>285 の例は using を使う形でも解決できる。 (設計意図によってはそれが妥当かどうかわからんけど。)

namespace ns {
struct foo {};

struct hoge {};
int operator+(const hoge& x, const hoge& y) { return 1; }
};

ns::foo operator+(const ns::foo& x, const ns::foo& y) { return ns::foo(); }

namespace ns {
template <class T>
void bar(const T&) {
using ::operator+; // グローバルな operator+ をオーバーロード候補として参加させる
T() + T();
}
};

int main() { bar(ns::foo()); }


テンプレートを見る機会がよくあるなら std::begin を using している事例は見たことがあると思う。