小编cp.*_*.cp的帖子

当类和函数具有单独的模板参数时,在类定义之外定义友元函数

以下代码可以正常编译(只是一个最小的示例,实际代码对这种特定布局有更多的原因):

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与声明不同的函数。

所以我的问题是:当类和函数具有单独的模板参数时,如何在类定义之外定义友元函数?

c++ templates friend

5
推荐指数
1
解决办法
855
查看次数

标签 统计

c++ ×1

friend ×1

templates ×1