Аргументы шаблона и базовые классы влияют на ADL, поэтому я думаю, что GCC верен, здесь: NS3 происходит из текущей области, NS1 из аргумента шаблона X и NS2 из базового класса аргумента шаблона.
Вы должны как-то устранить неоднозначность; Я бы предложил переименовать одну или несколько функций, если это возможно, или, возможно, использовать SFINAE для устранения неоднозначности функций.
(Аналогичная ситуация: обратите внимание, что boost :: noncopyable на самом деле "typedef noncopyable _ :: noncopyable noncopyable;", так что пространство имен boost не добавляется в набор типов ADL, производных от него.)