来自模板类的朋友函数

时间:2013-07-30 14:22:23

标签: c++ class templates friend

我有一个这样的课程:

#include "Blarg.h"
// ...

class Foo : public Bar {    
  // ...
  static double m_value;
  // ...    
}; 

另一个像这样:

template<class X, class Y>
class Blarg : public Bar {
  // ...
  void SetValue(double _val) { Foo::m_value = _val; }
  // ...
};

由于Foo的{​​{1}}是私有的(我希望保持这种方式),我想我会将m_value函数声明为{{1}的朋友} class,以便在需要时可以访问静态成员。

我已经在SetValue的公共区域内尝试了这些声明:

Foo

...但编译时没有运气。如果可能,这个的正确语法是什么?

3 个答案:

答案 0 :(得分:7)

您必须在Blarg课程之前定义Foo课程,才能将Blarg的某个方法标记为friend。确保Blarg在使用好友行宣布Foo之前定义(或包含)?

答案 1 :(得分:3)

这似乎对我有用:

template<class X, class Y>
class Blarg : public Bar {
    public:
        void SetValue(double _val);
};

class Foo : public Bar {
    private:
        static double m_value;

    public:
        template<class X, class Y> friend void Blarg<X,Y>::SetValue(double _val);
};

template <class X, class Y>
void Blarg<X,Y>::SetValue(double _val)
{
    Foo::m_value = _val;
}

我必须首先通过定义Blarg并使SetValue不是内联来打破循环依赖。你的朋友声明非常正确,除了丢失的返回值。

答案 2 :(得分:0)

这是正确的语法:

template<class T>
class Bla
{
 public:
  void toto(double val);
};    

class Foo {
  static double m_value;
  template<typename T>
  friend void Bla<T>::toto (double);
} ;

另外,请确保在Bla之前定义Foo