如果在类中定义了模板化的朋友函数,为什么似乎没有公开呢?

时间:2017-03-17 20:11:59

标签: c++ templates friend-function

这似乎有效:

mouseout

http://ideone.com/lApGTi

好的,让我们做一个看似纯粹的美化改变,并将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); } 的定义移到f的主体:

struct

突然编译开始失败:

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

int main() {
    f(5);
}

http://ideone.com/ImsQtJ

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

是否有任何技巧可以在类定义的主体内定义函数prog.cpp: In function ‘int main()’: prog.cpp:6:5: error: ‘f’ was not declared in this scope f(5); ^

1 个答案:

答案 0 :(得分:1)

当你在类中实现了友元函数内联时,它的声明在没有argument-dependent lookup的类之外是不可见的。

仅当person或其任何嵌套类使用friend函数时,这才有用。

普通类也存在这个问题,而不仅仅是类模板。以下是一个问题。

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

int main() {
   f(5);
}