Функция 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
.