Operator w zakresie przestrzeni nazw ukrywa inny w zasięgu globalnym

Czy to błąd kompilatora?

template <typename T>
T& operator++(T& t)
{
    return t;
}

namespace asdf {

enum Foo { };
enum Bar { };

Foo& operator++(Foo& foo);

void fun()
{
    Bar bar;
    ++bar;
}

} // end namespace asdf

int main()
{
    return 0;
}

Komunikat o błędzie GCC 4.7 brzmi:

error: no match for 'operator++' in '++bar'
note: candidate is:
note: asdf::Foo& asdf::operator++(asdf::Foo&)
note: no known conversion for argument 1 from 'asdf::Bar' to 'asdf::Foo&'

Kompiluje się, jeśli skomentujesz linię:

Foo& operator++(Foo& foo);

questionAnswers(3)

yourAnswerToTheQuestion