首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >模板交友语法

模板交友语法
EN

Stack Overflow用户
提问于 2012-10-30 14:52:36
回答 2查看 297关注 0票数 8

假设我有两个模板类。

代码语言:javascript
运行
复制
template<class T>
class baseclass1
{
    template<class> friend class baseclass2;
}

template<class D>
class baseclass2
{
     template<class T> void foo( D& x, T& y)
     {
          ...
     }
}

上面的代码允许所有类型的baseclass1朋友所有类型的baseclass2,一种多到多的关系.我有两个问题,

什么语法允许baseclass1仅仅是函数的朋友?

代码语言:javascript
运行
复制
baseclass2<class D>::foo<class T>( D& x, T& y).  

还有,什么语法允许baseclass1仅仅是函数的朋友?

baseclass2<class D>::foo<class T>( D& x, T& y),其中来自baseclass1T与函数foo中的T匹配。

编辑

对于那些不断声称你不能成为模板专业的朋友的人。这段代码起作用

代码语言:javascript
运行
复制
template<class cake>
class foo
{
    public:
        static void bar(cake x)
        {
            cout << x.x;
        }
};


class pie
{
    public:
        void set( int y){ x = y; }
    private:
        int x;

        friend void foo<pie>::bar(pie x);
};

class muffin
{
    public:
        void set( int y){ x = y; }
    private:
        int x;

    friend void foo<pie>::bar(pie x);
};

int main
{
        pie x;
        x.set(5);
        foo<pie>::bar(x);

        muffin y;
        y.set(5);
        //foo<muffin>::foo(y); //Causes a compilation Error because I only friended the pie specialization
}

甚至注意到哪里的松饼朋友错误的foo,而且仍然会导致编译错误。这既适用于函数也适用于类。我完全愿意接受,在我的具体情况下,这是不可能的(它看起来越来越多),我只是想了解为什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-30 15:26:40

baseclass2<D>::foo的所有可能的专业建立朋友关系是相当容易的:

代码语言:javascript
运行
复制
template<class T> class baseclass1;

template<class D>
class baseclass2{
public:
  template<class T>
  void foo(D&, T&){ baseclass1<T> x; x.priv_foo(); }
};

template<class T>
class baseclass1{
  template<class D>
  template<class U>
  friend void baseclass2<D>::foo(D&, U&);

  void priv_foo(){}
};

template<class T>
class baseclass1{
  template<class D>
  template<class U>
  friend void baseclass2<D>::foo(D&, U&);
};

活的例子。

baseclass2的前向声明(因此baseclass1知道baseclass2存在并且是一个模板)和两个模板,一个用于类,一个用于函数。对于类模板的函数模板的类外定义也是这样的。:)

但是,baseclass2<D>::foo<T>是不可能的,否则我就找不到正确的语法。

解决方法可能是一些全局函数,它转发访问并与通键模式一起进行,但是meh,它是一个混乱(imho):

代码语言:javascript
运行
复制
template<class D> class baseclass2;

template<class D, class T>
void baseclass2_foo(baseclass2<D>& b, D&, T&);

template<class D, class T>
class baseclass2_foo_key{
  baseclass2_foo_key(){} // private ctor
  friend void baseclass2_foo<>(baseclass2<D>&, D&, T&);
};

template<class T>
class baseclass1{
public: // public access, but only baseclass2_foo can create the key
  template<class D>
  void priv_foo(baseclass2_foo_key<D, T> const&){}
};

template<class D, class T>
void baseclass2_foo(baseclass2<D>&, D&, T&){
  baseclass1<T> x;
  x.priv_foo(baseclass2_foo_key<D, T>());
}

template<class D>
class baseclass2{
public:
  template<class T>
  void foo(D& d, T& t){ baseclass2_foo(*this, d, t); }
};

活的例子。

票数 2
EN

Stack Overflow用户

发布于 2012-10-30 15:17:37

可以将foo的所有实例化指定为朋友,但不能指定特定的实例化:

代码语言:javascript
运行
复制
template< class T >
class C1 {
public:
    template< class Q > void foo( T& x, Q& y ) {
    }
};
template< class T >
class C2 {
    template< class Y > 
    template< class Q > friend void C1<Y>::foo( Y&, Q& );
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13141629

复制
相关文章

相似问题

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