【发布时间】:2018-05-01 08:20:19
【问题描述】:
下面的代码编译得很好(只是一个最小的例子,实际的代码有更多的原因是这种特殊的布局):
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>());
}
但是,我想将声明与定义分开,并将函数定义放在类定义之外。我已经尝试过像对成员函数那样做:
template<int A> template<int B>
int bar(Foo<A> a, Foo<B> b) {
return A * B;
}
但编译失败,因为它似乎不是有效的语法:
error: too many template-parameter-lists
但是,合并此定义中的两个模板参数列表 (template<int A, int B>) 会导致链接器错误:
undefined reference to `int bar<1>(Foo<0>, Foo<1>)'
这让我相信不同的模板参数列表会导致编译器/链接器将bar 的定义解释为与声明不同的函数。
所以我的问题是:当类和函数具有单独的模板参数时,如何在类定义之外定义友元函数?
【问题讨论】:
-
明确一点:即使单个
template函数定义紧跟类模板定义(在同一个文件中),也会发生链接器错误? -
@Angew 是的,我将所有代码放在同一个文件中以测试我的最小示例
-
我认为 Rakete1111 的回答是正确的。所以...对解决方法感兴趣? wandbox.org/permlink/jrHIq5sSSQ8lUPYd
-
@bogdan 目前我的代码中只有一个短函数存在这个问题,所以我不想为此添加大量样板。我可能会将定义留在类定义中或使其成为成员函数。由于所讨论的函数是
operator*,因此其余代码是否使用朋友或成员函数并不重要。