首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于类模板朋友的几个问题

关于类模板朋友的几个问题
EN

Stack Overflow用户
提问于 2012-03-13 15:14:14
回答 2查看 213关注 0票数 2

我们有两个类模板:A和B,以及函数模板f1()。如下所示:

代码语言:javascript
复制
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使A与参数T的专业化成为B与论点T的专业化的朋友,但如何使A的每一种专业化都成为B的专门化朋友呢?

问题2:如何定义类定义之外的f1?这样的代码将生成一个错误:

代码语言:javascript
复制
undefined reference to `f1(B<int>&)'

问题3:如何使所有f1()s (谁可以接受B的所有专门化作为参数)成为B的每个专门化的朋友?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-13 15:27:24

问题1:

你真的想这么做吗?您想让A<int>访问B<float>吗?通常你不会,但如果你真的想:

代码语言:javascript
复制
template <typename U>
friend class A;

问题2:

2中的问题是,您并不是让f1模板的实例化成为朋友,而是尝试使一个非模板的免费函数f1B<int>作为您的朋友。要与特定实例化建立朋友关系的正确语法很麻烦:

代码语言:javascript
复制
template <typename T> class B;
template <typename T> void f( B<T>& );
template <typename T>
class B {
   friend void f<T>( B<T>& );
};

问题3:

要使f1的所有专门化成为朋友(同样,您真的想这样做吗?),您可以执行与类模板相同的方法:

代码语言:javascript
复制
template <typename U>
friend void f1( B<U>& );

更多关于那些here

票数 2
EN

Stack Overflow用户

发布于 2012-03-13 15:21:59

问题1:使用

代码语言:javascript
复制
template <typename U> friend class A; 

而不是

代码语言:javascript
复制
friend class A<T>;

问题2:表达式2所做的是将一个普通函数声明为B,而不是函数模板的专门化。要声明for为T的专门化,需要for子句查看f1的声明,并添加<>标记f1是一个专门化而不是重载的正常函数,因此

代码语言:javascript
复制
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的解决方案是两者的混合:

代码语言:javascript
复制
class B;
template< class T >
void f1( B<T> &b );
template< class T >
class B
{
    template <typename U> friend void f1( B<U> &b );
};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9686815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档