9

私はこのようなクラスを持っています:

#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(m_value私はそのままにしておきたい)、SetValue関数をクラスのフレンドとして宣言してFoo、必要に応じて静的メンバーにアクセスできるようにしようと考えました。

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);

...しかし、コンパイルに失敗しました。可能であれば、これの適切な構文は何ですか?

4

3 に答える 3

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;
}

最初に Blaarg を定義し、SetValue をインライン化しないことで、循環依存を解消する必要がありました。戻り値が欠落していることを除けば、友人の宣言はほとんど正しいものでした。

于 2013-07-30T14:54:48.760 に答える
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ください。

于 2013-07-30T14:47:49.587 に答える