为什么在 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);
}
好的,让我们做一个看似纯粹的外观更改,将 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);
^
为什么需要在 class 之外定义模板友元函数才能在此代码段中工作?
是否有任何技巧可以让函数 f
在 class 定义的主体中定义?
当您在 class 中内联实现友元函数时,如果没有 argument-dependent lookup.
,它的声明在 class 之外是不可见的
仅当友元函数被 class 或其任何嵌套的 classes 使用时才有用。
常规 classes 也存在该问题,而不仅仅是 class 模板。下面也是一个问题
struct S {
friend S f(int) {return S{};}
};
int main() {
f(5);
}
这似乎有效:
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);
^
为什么需要在 class 之外定义模板友元函数才能在此代码段中工作?
是否有任何技巧可以让函数 f
在 class 定义的主体中定义?
当您在 class 中内联实现友元函数时,如果没有 argument-dependent lookup.
,它的声明在 class 之外是不可见的仅当友元函数被 class 或其任何嵌套的 classes 使用时才有用。
常规 classes 也存在该问题,而不仅仅是 class 模板。下面也是一个问题
struct S {
friend S f(int) {return S{};}
};
int main() {
f(5);
}