Законно ли это?
Да, вы можете заставить его работать с C++14
и далее.
Как это сделать?
Вы можете сделать это так ( см. Здесь ):
class A;
template <class T>
inline auto func(T& val);
class A
{
friend auto func<A>(A& val);
int j = 6;
};
template <class T>
inline auto func(T& val)
{
return val.j;
}
int main()
{
A a;
return func<A>(a);
}
Однако я согласен с комментариями: вопрос мог бы быть улучшен, если бы вы предоставили точную проблему, для которой мы могли бы попытаться найти ответ.