为什么在 class 中定义的模板化友元函数似乎没有公开?

Why a templated friend function doesn’t seem to be exposed if it is defined within a class?

这似乎有效:

template<class A> struct S {
    template<class B> friend S<B> f(B);
};

template<class B> S<B> f(B) {return S<B>{};}

int main() {
    f(5);
}

http://ideone.com/lApGTi

好的,让我们做一个看似纯粹的外观更改,将 f 的定义移动到 struct 的主体:

template<class A> struct S {
    template<class B> friend S<B> f(B) {return S<B>{};}
};

int main() {
    f(5);
}

编译突然开始失败:

prog.cpp: In function ‘int main()’:
prog.cpp:6:5: error: ‘f’ was not declared in this scope
  f(5);
     ^

http://ideone.com/ImsQtJ

为什么需要在 class 之外定义模板友元函数才能在此代码段中工作?

是否有任何技巧可以让函数 f 在 class 定义的主体中定义?

当您在 class 中内联实现友元函数时,如果没有 argument-dependent lookup.

,它的声明在 class 之外是不可见的

仅当友元函数被 class 或其任何嵌套的 classes 使用时才有用。

常规 classes 也存在该问题,而不仅仅是 class 模板。下面也是一个问题

struct S {
   friend S f(int) {return S{};}
};

int main() {
   f(5);
}