这似乎有效:
mouseout
好的,让我们做一个看似纯粹的美化改变,并将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);
}
为什么需要在类之外定义模板友元函数才能在此代码段中使用?
是否有任何技巧可以在类定义的主体内定义函数prog.cpp: In function ‘int main()’:
prog.cpp:6:5: error: ‘f’ was not declared in this scope
f(5);
^
?
答案 0 :(得分:1)
当你在类中实现了友元函数内联时,它的声明在没有argument-dependent lookup的类之外是不可见的。
仅当person或其任何嵌套类使用friend函数时,这才有用。
普通类也存在这个问题,而不仅仅是类模板。以下是一个问题。
struct S {
friend S f(int) {return S{};}
};
int main() {
f(5);
}