Функция 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 ' s m_value является частным (и я хотел бы сохранить его таким образом), я думал, что объявлю SetValue функция как друг к Foo класс, чтобы он мог получить доступ к статическому члену, когда это необходимо.

Я пробовал объявления по этим строкам в С:

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

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

friend void Blarg::SetValue(double _val);

...но не повезло в компиляции. Как правильно синтаксис для этого, если возможно?

3 ответов


вы должны определить Blarg до Foo класс, чтобы отметить один из Blarg's метод как friend. Уверены, что Blarg определяется (или включается) перед Foo объявление с линией друга?


Это, кажется, работает для меня:

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 не встроенным. Объявление вашего друга было в значительной степени правильным, за исключением отсутствующего возвращаемого значения.


вот правильный синтаксис:

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.