以下代码可以正常编译(只是一个最小的示例,实际代码对这种特定布局有更多的原因):
template<int A>
class Foo {
template<int B>
friend int bar(Foo<A> a, Foo<B> b) {
return A * B;
}
};
int main() {
return bar(Foo<0>(), Foo<1>());
}
Run Code Online (Sandbox Code Playgroud)
但是,我想将声明与定义分开,并将函数定义放在类定义之外。我尝试像对待成员函数一样这样做:
template<int A> template<int B>
int bar(Foo<A> a, Foo<B> b) {
return A * B;
}
Run Code Online (Sandbox Code Playgroud)
但这无法编译,因为它似乎不是有效的语法:
error: too many template-parameter-lists
Run Code Online (Sandbox Code Playgroud)
但是,合并此定义 ( ) 中的两个模板参数列表template<int A, int B>会产生链接器错误:
undefined reference to `int bar<1>(Foo<0>, Foo<1>)'
Run Code Online (Sandbox Code Playgroud)
这让我相信不同的模板参数列表会导致编译器/链接器将 的定义解释为bar与声明不同的函数。
所以我的问题是:当类和函数具有单独的模板参数时,如何在类定义之外定义友元函数?