Вы случайно нажали мой тест - последовательность T ::first:: ...
интерпретируется как одиночное имя. Вам нужно положить токен между двоеточиями и T
. Решение представлено и в связанном вопросе.
Обратите внимание, что в любом случае вы должны сначала объявить функцию, обозначенную квалифицированным именем, в соответствующем пространстве имен.
Редактировать: Существуют различные решения для проблемы синтаксиса
template <typename T> friend T (::first::FirstMethod)();
template <typename T> T friend ::first::FirstMethod();
Если вам часто приходится обращаться к внешнему пространству имен и возникают проблемы с этим синтаксисом, вы можете ввести псевдоним пространства имен
namespace first
{
namespace outer_first = ::first;
class Second
{
template <typename T> friend T outer_first::FirstMethod();
};
}