gpt4 book ai didi

c++ - 关于类模板友元的一些问题

转载 作者:搜寻专家 更新时间:2023-10-31 00:43:59 25 4
gpt4 key购买 nike

我们有两个类模板:A 和 B,以及一个函数模板 f1()。像这样:

template< class T >
class A{};

template< class T >
class B
{
friend class A<T>; /* Expression 1 */
friend void f1( B<T> &b ); /* Expression 2 */
};

template< class T >
void f1( B<T> &b ) {}

int main()
{
A< int > a;
B< int > b;

f1( b );

return 0;
}

问题 1:表达式 1 使带有参数 T 的 A 的特化成为友元B 与参数 T 的特化。但是如何使每个特化 A 所有 friend 都特化 B?

问题2:如何在类定义之外定义f1?像这样的代码会产生一个错误:

undefined reference to `f1(B<int>&)'

问题 3: 如何生成所有 f1()(谁可以接收 B 的所有特化作为参数)B的每个专业的 friend ?

最佳答案

问题一:使用

template <typename U> friend class A; 

代替

friend class A<T>;

问题 2:表达式 2 的作用是声明 friend 是一个接受 B 的普通函数,而不是函数模板的特化。要声明 friend 是 T 的特化,您需要 friend 子句查看 f1 的声明并添加 <>标记 f1 是一个特化而不是一个重载的普通函数,所以

template< class T >
class B;
template< class T >
void f1( B<T> &b );
template< class T >
class B
{
friend void f1<>( B<T> &b );
};

template< class T >
void f1( B<T> &b ) {}

问题 3 的解决方案是两者的混合:

class B;
template< class T >
void f1( B<T> &b );
template< class T >
class B
{
template <typename U> friend void f1( B<U> &b );
};

关于c++ - 关于类模板友元的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9686815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com