我有一个这样的课程:
#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
...但编译时没有运气。如果可能,这个的正确语法是什么?
答案 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
。